我有一个Hadoop作业,我想将输出文件夹的复制数设置为1,我想在Java代码中执行此操作。我们服务器上的默认值是3.另一个导入方面是在写入输出之前设置复制号。这意味着我不想用3个副本编写整个输出,然后将其减少到1.我希望在它开始写入输出文件夹之前设置它,这样就只有一个复制。原因是输出可能非常大,我想节省一些空间。
@Override
public int run(String[] args) throws Exception {
/** Get configuration */
Configuration conf = getConf();
conf.setStrings("args", args);
/** Job configuration */
Job job = Job.getInstance(conf, "HadoopSearch");
job.setJarByClass(Search.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
/** Set Mapper and Reducer, use identity reducer*/
job.setMapperClass(Map.class);
job.setReducerClass(Reducer.class); // identity
/** Set input and output formats */
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
/** Set input and output path */
FileInputFormat.addInputPath(job, new Path("IN PATH"));
FileOutputFormat.setOutputPath(job, new Path("OUT PATH"));
job.waitForCompletion(true);
return 0;
}
我知道我可以使用FileSystem.setReplication(Path p, short s)
来设置它,但这只适用于每个文件,我希望它为整个文件夹设置。我可以遍历文件夹内的文件,但更重要的是,这似乎只有在作业完成并且文件已经存在之后才能工作。正如我所假设的那样,复制过程已经在运行,我可以解决我想避免的磁盘空间问题。
答案 0 :(得分:1)
在Mapreduce中,您可以使用set job配置设置dfs.replication属性,以便在该作业中创建的文件具有指定的复制因子。希望这会有所帮助。
Configuration conf = new Configuration();
conf.set("dfs.replication", "1");
Job job = new Job(conf);