将Map器输出发送到不同的reducer

flvtvl50  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(385)

我是hadoop的新手,现在正在使用javaMap器/还原器代码。在工作中,我遇到了一个问题,我必须将Map器类的输出传递给两个不同的reducer类。如果可能的话。我们是否可以从同一个Map器类发送两个不同的输出…有人能告诉我吗。。

rhfm7lfc

rhfm7lfc1#

我也试着这么做。根据我的发现,我们不能让Map器输出发送到两个还原器。但是可以通过区分减速器中的任务,在一个减速器中的两个减速器中执行您想要执行的任务。reducer可以根据一些关键标准选择任务。我必须警告你,我是hadoop新手,所以这可能不是最好的答案。
Map程序将生成这样的键+-任务\u x。然后,reducer将调用不同的方法来处理任务
我认为最好在末尾加上任务名称,以确保有效的分区。
至于第二个问题,我相信您可以将同一Map器类的多个输出发送到reducer。这篇文章也许对你感兴趣,hadoop mapper能在输出中产生多个键吗?
map方法如下所示

@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);
        }
    }

相关问题