最近看dadoop中关于辅助排序(SecondarySort)的实现,说到了三个东西要设置:1. partioner;2. Key Comparator;3. Group Comparator。前两个都比较容易理解,但是关于group的概念我一直理解不了,一,有了partioner,所有的key已经放到一个分区了,每个分区对应一个reducer,而且key也可以排序了,那么不是实现了整个数据集的全排序了吗?第二,mapper产生的中间结果经过shuffle和sort后,每个key整合成一个记录,每次reduce方法调用处理一个记录,但是group的目的是让一次reduce调用处理多条记录,这不是矛盾吗,找了好久一直都没找到这个问题的清晰解释。
后来找到一本书,《Pro Hadoop》,里面有一部分内容详细解释了这个问题,看后终于明白了,和大家分享一下。reduce方法每次是读一条记录,读到相应的key,但是处理value集合时,处理完当前记录的values后,还会判断下一条记录是不是和当前的key是不是同一个组,如果是的话,会继续读取这些记录的值,而这个记录也会被认为已经处理了,直到记录不是当前组,这次reduce调用才结束,这样一次reduce调用就会处理掉一个组中的所有记录,而不仅仅是一条了。
这个有什么用呢?如果不用分组,那么同一组的记录就要在多次reduce方法中独立处理,那么有些状态数据就要传递了,就会增加复杂度,在一次调用中处理的话,这些状态只要用方法内的变量就可以的。比如查找最大值,只要读第一个值就可以了。
参考资料: 《Pro Hadoop》