方法一
设置一个分区,当文件较大时效率低
方法二
创建一系列有序的文件,然后归并排序这些文件,得到一个全局有序的文件。(1000个1-10000的数据,跑10个ruduce任务)
借鉴快速排序的思路:假设为升序排序,那么每完成一次partition,基准元素左边所有元素的值都小于等于基准元素,而基准元素右边的所有元素的值都大于等于基准元素,如果现在有N个基准元素,那么数据就被map成了N+1个区间,让reducer个数等于N+1,将不同区间的数据发送到相应区间的reducer;hadoop利用shuffle操作将这N+1份数据自动排序,reduce操作只需要接收中间结果后直接输出到文件即可。
由此归纳出用hadoop对大量数据排序的步骤:
1)、对待排序数据进行抽样;
2)、对抽样数据进行排序,产生基准元素(例如得到的pivot为:3,9,11);
3)、Map对输入的每条数据计算其处于哪两个基准元素之间,之后将数据发给相应的reduce(例如区间划分为:<3、[3,9)、>=9,分别对应reducer0、reducer1、reducer2);
4)、Reduce将获得数据直接输出。
通过对key空间进行采样就可以较为均匀的划分数据集,避免数据倾斜,使得每个rudece的执行时间大致相同
网友评论