Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么组合器输出记录=0?_Java_Hadoop_Mapreduce_Combiners_Bigdata - Fatal编程技术网

Java 为什么组合器输出记录=0?

Java 为什么组合器输出记录=0?,java,hadoop,mapreduce,combiners,bigdata,Java,Hadoop,Mapreduce,Combiners,Bigdata,我有多个输入,所以我有两个映射器。我还有一个组合器: class JoinCombiner extends MapReduceBase implements Reducer<TextPair, Text, TextPair, Text> { @Override public void reduce(TextPair key, Iterator<Text> values, OutputCollector<Tex

我有多个输入,所以我有两个映射器。我还有一个组合器:

class JoinCombiner extends MapReduceBase implements
        Reducer<TextPair, Text, TextPair, Text> {

    @Override
    public void reduce(TextPair key, Iterator<Text> values,
            OutputCollector<TextPair, Text> output, Reporter reporter)
            throws IOException {

        Text nodeId = new Text(values.next());
        while (values.hasNext()) {
            Text node = values.next();
            TextPair outValue = new TextPair(nodeId.toString(), "0");
            output.collect(outValue , node);
        }
    }
}
因此,组合器没有输出->reduce没有输入。我不明白为什么。如果你有什么想法,请解释一下
谢谢

只有当您有减速器时,才会执行组合器。尝试将组合器和减速器设置为同一类(如果可能的话),也考虑设置减少任务的数量。

更新:您正在尝试更改组合器中的密钥。组合器的目的是在本地将同一密钥的值分组在一起,以减少通信量

Combiner类的实例在已运行映射任务的每个节点上运行。组合器将接收给定节点上映射器实例发出的所有数据作为输入。组合器的输出随后被发送到减速器,而不是映射器的输出

根据我的经验,这并不完全正确。Hadoop只将映射器发出的键发送到reducer,这意味着如果在两者之间有一个组合器,它应该发出与映射器相同的键,从而减少与该键关联的值的数量。在我看来,更改组合器中的键会导致意外行为。为了让您理解组合器的简单用法,请考虑一个字计数器。< /P> Mapper1发射:

hi 1
hello 1
hi 1
hi 1
hello 1
Mapper2发射:

hello 1
hi 1
hello 1
hi 1
您有七个输出记录。现在,如果您想在本地减少键的数量(意味着在映射程序运行的同一台机器上),那么拥有一个组合器将为您提供如下功能:

组合器1发射:

hi 3
hello 2
组合器2发射:

hello 1
hi 1
hello 1
hi 1
请注意,组合器没有更改键。现在,在减速器处,您将获得如下值:

减速机1:
键:hi,值:
并且您发出
hi 4

因为您只有一个减速器,所以这次将通过给它一个不同的键来再次调用同一个减速器

还原器1:
键:hello,值:
并且您发出
hello 3

最终结果如下

hello 3
hi 4

输出根据映射器发出的键进行排序您可以选择更改减速器发出的键,但您的输出不会按减速器发出的键排序(默认情况下)。希望能有所帮助。

请看一下我有什么。这是我对作业的配置:conf.setCombinerClass(JoinCombiner.class);conf.setReduceClass(JoinCombiner.class);conf.setNumReduceTasks(1);我在日志中看到的是:映射输入记录=6映射输出记录=6映射输出字节=58映射输出物化字节=30输入分割字节=1070组合输入记录=6组合输出记录=0减少输入组=0减少无序字节=30减少输入记录=0减少输出记录=0看起来您正在更改组合器。请参阅我的更新答案。您可以在这篇stackoverflow文章中查找有关combiner的更有趣的事实: