我理解在键进入reducer之前对特定键的值进行排序的方法。我了解到可以通过编写三种方法来实现,即keycomparator,partitioner和valuegrouping。
现在,当值分组运行时,它基本上将与自然键关联的所有值组合在一起,对吗?因此,当它对自然键的所有值进行分组时,与一组排序值一起发送到reducer的实际键是什么?自然键可能与多种类型的实体(复合键的第二部分)相关联。发送到减速机的复合键是什么?
AP
答案 0 :(得分:4)
这可能会令人惊讶地知道,但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
}
}
我知道这适用于新的mapreduce API,我没有为旧的mapred API追踪它。
因此,在回答您的问题时,所有密钥都可用,第一个密钥将与该组的第一个排序密钥相关。
编辑:有关其工作原理和原因的一些其他信息:
reducer使用两个比较器来处理map阶段输出的键/值对:
在引擎盖下,对键和值的引用永远不会改变,每次调用Iterable.Iterator.next()都会将基础字节流中的指针前进到下一个KV对。如果密钥分组确定当前密钥字节集和先前集合是相对相同的密钥,则值Iterable.iterator()的hasNext方法将返回true,否则返回false。如果返回true,则将字节反序列化为Key和Value实例,以便在reduce方法中使用。