问题
sort by:只保证每个 reducer 的输出有序,不保证全局有序。
学习Hive SQL的sort by进行的一次测试,如下所示:
set mapreduce.job.reduces=2;
select * from student sort by age desc;
3 ww male 22 maths
1 zs male 20 maths
4 zl male 19 english
5 sq male 17 chinese
2 ls female 21 english
6 qb female 18 chinese
在这里将reducer数量设为2,验证sort by局部排序的作用。根据查询结果,可以推断前面四行由一个 reducer 处理,后面 2 行由另一个 reducer 处理。
记录
查询结果看似按 sex 进行了分组,但这只是一个巧合。实际上,此处sort by age是转化为了MapReduce任务,reduce数量为二,即map阶段分成了两个分区,且是根据age(key)来进行的分区,验证如下:
MapReduce默认使用的分区函数是HashPartitioner,源码如下:
模拟HashPartitioner流程如下:
结果如下:
由于reduce数量为2,故而取余后只有1、0两种结果,经过验证,sort by结果前四行age运算后结果相同,后两行运算后结果相同,所以Map阶段分区的结果应该是sort by结果前四行为一个分区,后两行为一个分区,分区之后再在Reduce中完成排序,结果符合推断。