6.4.3 shuffle过程的优化

熟悉了上面介绍的shuffle过程,可能有读者会说:这个shuffle过程不是最优的。是的,Hadoop采用的shuffle过程并不是最优的。举个简单的例子,如果现在需要Hadoop集群完成两个集合的并操作,事实上并操作只需要让两个集群中重复的元素在最后的结果中出现一次就可以了,并不要求结果的元素是按顺序排列的。但是如果使用Hadoop默认的shuffle过程,那么结果势必是排好序的,显然这个处理就不是必须的了。在这里简单介绍从Hadoop参数的配置出发来优化shuffle过程。在一个任务中,完成单位任务使用时间最多的一般都是I/O操作。在Map端,主要就是shuffle阶段中缓冲区内容超过阈值后的写出操作。可以通过合理地设置ip.sort.*属性来减少这种情况下的写出次数,具体来说就是增加io.sort.mb的值。在Reduce端,在复制Map输出的时候直接将复制的结果放在内存中同样能够提升性能,这样可以让部分数据少做两次I/O操作(前提是留下的内存足够Reduce任务执行)。所以在Reduce函数的内存需求很小的情况下,将mapred.inmem.merge.threshold设置为0,将mapreed.job.reduce.input.buffer.percent设置为1.0(或者一个更低的值)能够让I/O操作更少,提升shuffle的性能。