Java Map-Reduce中的二次排序

Java Map-Reduce中的二次排序,java,hadoop,parallel-processing,mapreduce,Java,Hadoop,Parallel Processing,Mapreduce,我了解在某个键进入减速机之前对该键的值进行排序的方法。我了解到可以通过编写三种方法来实现,即keycomparator、partitioner和valuegrouping 现在,当valuegrouping运行时,它基本上会对与自然键关联的所有值进行分组,对吗?因此,当它对自然键的所有值进行分组时,与一组已排序的值一起发送到reducer的实际键是什么?自然密钥将与多个类型的实体(复合密钥的第二部分)关联。将向减速器发送什么复合钥匙 ap知道这一点可能令人惊讶,但每次迭代Iterable值实际上

我了解在某个键进入减速机之前对该键的值进行排序的方法。我了解到可以通过编写三种方法来实现,即keycomparator、partitioner和valuegrouping

现在,当valuegrouping运行时,它基本上会对与自然键关联的所有值进行分组,对吗?因此,当它对自然键的所有值进行分组时,与一组已排序的值一起发送到reducer的实际键是什么?自然密钥将与多个类型的实体(复合密钥的第二部分)关联。将向减速器发送什么复合钥匙


ap

知道这一点可能令人惊讶,但每次迭代Iterable值实际上也会更新关键参考:

protected void reduce(K key, Iterable<V> values, Context context) {
    for (V value : values) {
        // key object contents will update for each iteration of this loop
    }
}
我知道这适用于新的MapReduceAPI,但我还没有针对旧的MapRedAPI进行跟踪

因此,在回答您的问题时,所有键都将可用,第一个键将与组中的第一个排序键相关

编辑:关于如何以及为什么这样做的一些附加信息:

reducer使用两个比较器来处理map阶段输出的键/值对:

键排序比较器-首先应用该比较器并对所有KV对进行排序。从概念上讲,在这个阶段您仍然在处理序列化字节。 键组比较器-该比较器负责确定前一个键和当前键何时“不同”,表示一组KV对和另一组KV对之间的边界
在后台,对键和值的引用永远不会更改,每次调用Iterable.Iterator.next都会将底层字节流中的指针前进到下一对。如果密钥分组程序确定当前的密钥字节集和上一个密钥字节集是相对相同的密钥,那么值Iterable.iterator的hasNext方法将返回true,否则返回false。如果返回true,字节将反序列化到Key和Value实例中,以便在reduce方法中使用。

这可能会让人惊讶,但每次迭代Iterable值时实际上也会更新Key引用:

protected void reduce(K key, Iterable<V> values, Context context) {
    for (V value : values) {
        // key object contents will update for each iteration of this loop
    }
}
我知道这适用于新的MapReduceAPI,但我还没有针对旧的MapRedAPI进行跟踪

因此,在回答您的问题时,所有键都将可用,第一个键将与组中的第一个排序键相关

编辑:关于如何以及为什么这样做的一些附加信息:

reducer使用两个比较器来处理map阶段输出的键/值对:

键排序比较器-首先应用该比较器并对所有KV对进行排序。从概念上讲,在这个阶段您仍然在处理序列化字节。 键组比较器-该比较器负责确定前一个键和当前键何时“不同”,表示一组KV对和另一组KV对之间的边界
在后台,对键和值的引用永远不会更改,每次调用Iterable.Iterator.next都会将底层字节流中的指针前进到下一对。如果密钥分组程序确定当前的密钥字节集和上一个密钥字节集是相对相同的密钥,那么值Iterable.iterator的hasNext方法将返回true,否则返回false。如果返回true,字节将反序列化到Key和Value实例中,以便在reduce方法中使用。

!谢谢好主意。@ChrisWhite你能再解释一下他的答案吗。我对你的行为也有同样的问题,但我发现很难理解它是如何工作的。@Chris有没有提到这种行为?太棒了!谢谢好主意。@ChrisWhite你能再解释一下他的答案吗。我对你的行为也有同样的问题,但我发现很难理解它是如何工作的。@Chris有没有提到过这种行为?