多个Reducer和一个输出文件

时间:2014-03-10 16:46:16

标签: hadoop mapreduce

在我的hadoop代码中,我有4个reducer,我总是有4个输出文件,这是很正常的,因为每个reducer将其结果放在一个文件中。 我的问题是:如何才能拥有一个且只有一个输出文件?

问题是我有一个迭代mapreduce作业,它接受一个输入文件,将它分成一个chunck并将每个chunck给一个mapper,这就是为什么我必须收集所有reducers结果并将它们放在一个输出文件中为了将此输出文件以等效方式划分为4个部分,然后将每个部分分配给一个映射器,依此类推。

2 个答案:

答案 0 :(得分:0)

您可以尝试MultipleOutputs,您可以在其中指定每个reducer应写入的输出文件。 例如,在你的reducer代码中:

   ...
   public void setup(Context context) {
       out = new MultipleOutputs<YourKey,YourValue>(context);     
     }
    public void reduce(YourKey key, Iterable<YourValue> values, Context context)
            throws IOException, InterruptedException {
             .......
        //instead of writing using context, use multipleoutput here
        //context.write(key, your-result);
        out.write(key, your-result,"path/filename");
    }
    public void cleanup(Context context) throws IOException,InterruptedException {
        out.close();        
     }
    .....

对于这种情况,您还需要确保一些作业配置。

......
job.setOutputFormatClass(NullOutputFormat.class);
LazyOutputFormat.setOutputFormatClass(job, FileOutputFormat.class);
FileOutputFormat.setOutputPath(job, new Path("output"));
......

在这种情况下,everyreducer out put将被写入output/path/filename

答案 1 :(得分:-1)

您可以很好地配置所需的减速机数量。 在定义你的工作时使用这个

job.setNumReduceTasks(1)