2014-09-12 29 views
2

我有一个Hadoop作业,我想将输出文件夹的复制数设置为1,我想在Java代码中执行此操作。我们服务器上的默认值是3.另一个导入方面是在输出写入之前设置复制编号。这意味着我不想用3个副本写出整个输出,然后将其减少到1.我希望在开始写入输出文件夹之前设置它,以便只有一个复制。原因是输出可能很大,我想腾出一些空间。在执行之前在Java代码中设置Hadoop输出文件夹复制

@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

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

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