众所周知,在mr程序中使用GroupingComparator组件是为用于在mapper输出的<k,v>对中规定相同的key,
从而对一组k相同的<k,v>对调用一次reduce方法,以第一个<k,v>对的k作为reduce方法的key,并将这一组v用Iterable<T> values传入。
但是在使用该组件时发现问题:(本来想详细地描述一下场景和现象的,不过实在耗时间,我就简略说重点了)
有些符合条件的<k,v>对并没有按照我加入的GroupingComparator组件中定义的规则,
看作相同的key,并按照<key,values>调用一次reduce方法。而是调用了多次reduce方法,
根据输入的不同而不同,并不固定。
这一问题在网上没有找到详细地解释。书上对GroupingComparator组件的工作机制也没有详细地说明。
经过多次实验发现:
GroupingComparator组件在判断一组<k,v>对有多少可以看作相同key的过程中,
并不是遍历全部的<k,v>对后才做出判断,而是先比较下一个<k,v>对,
若此两个k可看作相同,才继续比较下一个,又相同才又比较下一个...
若比较到不同了,就不继续比较了,
直接根据前面得到的一组<k,v>对就调用reduce方法了。
下一次判断从上次比较为不相同的一个<k,v>对开始。
所以出现问题的地方就是:
哪些key可看作相同的<k,v>对没有排列在一起,若中间插入了其他key不同的<k,v>对,
则在比较到不同时就调用reduce方法了,即使后面仍有相同的<k,v>对。
具体地你们可以追一下源码,或者构造出一些合适的输入文件,以验证这个解释。