在执行之前,在Java代码中设置Hadoop输出文件夹复制

时间:2014-09-12 17:31:09

标签: java hadoop hdfs

我有一个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)来设置它,但这只适用于每个文件,我希望它为整个文件夹设置。我可以遍历文件夹内的文件,但更重要的是,这似乎只有在作业完成并且文件已经存在之后才能工作。正如我所假设的那样,复制过程已经在运行,我可以解决我想避免的磁盘空间问题。

1 个答案:

答案 0 :(得分:1)

在Mapreduce中,您可以使用set job配置设置dfs.replication属性,以便在该作业中创建的文件具有指定的复制因子。希望这会有所帮助。

    Configuration conf = new Configuration();
    conf.set("dfs.replication", "1");
    Job job = new Job(conf);