将映射器输出发送到不同的reducer

时间:2014-07-02 11:33:32

标签: java hadoop

我是Hadoop的新手,现在我正在使用java mapper / reducer代码。在工作的时候,我遇到了一个问题,我必须将mapper类的输出传递给两个不同的reducer类。如果可能或不可以。我们也可以从同一个mapper类发送两个不同的输出......任何人都可以告诉我..

1 个答案:

答案 0 :(得分:1)

我一直在努力做同样的事情。基于我发现的,我们不能将mapper输出发送到两个reducer。但是可以通过区分reducer中的任务来执行您想要在两个Reducer中执行的任务。减速器可以根据一些关键标准选择任务。我必须警告你,我是hadoop的新手,所以可能不是最好的答案。

映射器将生成像这样的键+ -TASK_XXXX。然后reducer将调用不同的方法来处理TASK_XXXX

认为最好让TASK_NAME在最后确保有效的分区。

至于你的第二个问题,我相信你可以将同一个mapper类的多个输出发送到reducer。您可能感兴趣的这篇文章Can Hadoop mapper produce multiple keys in output?

地图方法看起来像

    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException {
        //do stuff 1
        Text outKey1 = new Text(<Your_Original_Key>+"-TASK1");
        context.write(outKey, task1OutValues);

        //do stuff 2
        Text outKey2 = new Text(<Your_Original_Key>+"-TASK2");
        context.write(outKey, task2OutValues);
    }

并减少方法

    @Override
    protected void reduce(Text inkey, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {
        String key = inKey.toString();
        if(inKey.matches(".*-TASK1$")) {
            processTask1(values);
        } else if(inKey.matches(".*-TASK2$")) {
            processTask2(values);
        }
    }