本章内容咱们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的从新分配,主要分为两部分:1. map 任务输出的数据分组、排序,写入本地磁盘 2. reduce 任务拉取排序。因为该过程涉及排序、磁盘IO、以及网络IO 等消耗资源和 CPU 比较大的操做,所以该过程向来是“兵家必争”之地,即你们会重点优化的一个地方,所以也是大数据面试中常常会被重点考察的地方。本文力求通俗、简单地将 Shuffle 过程描述清楚。面试
包含 Shuffle 过程的 MapReduce 任务处理流程以下图,图片来自《Hadoop权威指南(第四版)》apache
接下来,分别介绍 Shuffle 所涉及的主要操做。网络
map 端输出时,先将数据写入内存中的环形缓冲区,默认大小为 100M,能够经过 mapreduce.task.io.sort.mb 来设置。map 端输出过程以下:多线程
以上即是 map 任务输出过程的主要操做,输出到磁盘后,reducer 会经过 http 服务拉取输出文件中属于本身分区的数据。并发
reduce 端在 Shuffle 阶段主要涉及复制和排序两个过程。 reduce 端拉取 map 输出数据的过程是复制阶段,对应上图中的 fetch。一个 reduce 任务须要从多个 map 输出复制。所以只要有 map 任务完成,reduce 任务就能够进行复制。复制的过程能够是多线程并发进行,并发的线程个数由 mapreduce.reduce.shuffle.parallelcopies 设置,默认是 5 。app
以上即是 reduce 任务前的复制、排序阶段。至此,整个 Shuffle 过程就介绍完毕。函数
咱们在上面介绍 Shuffle 过程时已经提到了一些参数,这里统一整理并说明一下oop
参数名 | 默认值 | 说明 |
mapreduce.task.io.sort.mb | 100 | map 输出是所使用的内存缓冲区大小,单位:MB |
mapreduce.map.sort.spill.percent | 0.80 | map 输出溢写到磁盘的内存阈值 |
mapreduce.task.io.sort.factor | 10 | 排序文件是一次能够合并的流数 |
mapreduce.map.output.compress | false | map 输出是否压缩 |
mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | map 输出压缩的编解码器 |
咱们但愿在 map 输出阶段可以提供更多的内存空间,以提高性能。所以 map 函数应该尽可能少占用内存,以便留出内存用于输出。咱们也能够评估 map 输出,经过增大 mapreduce.task.io.sort.mb 值来减小溢写的文件数。性能
参数名 | 默认值学习 |
说明 |
mapreduce.reduce.shuffle.parallelcopies | 5 | 并发复制的线程数 |
mapreduce.task.io.sort.factor | 10 | 同 map 端 |
mapreduce.reduce.shuffle.input.buffer.percent | 0.70 | Shuffle 的复制阶段,用来存放 map 输出缓冲区占reduce 堆内存的百分比 |
mapreduce.reduce.shuffle.merge.percent | 0.66 | map 输出缓冲区的阈值,超过该比例将进行合并和溢写磁盘 |
mapreduce.reduce.merge.inmem.threshold | 1000 | 阈值,当累积的 map 输出文件数超过该值,进行合并和溢写磁盘,0或者负值意味着改参数无效,合并和溢写只由 mapreduce.reduce.shuffle.merge.percent 控制 |
mapreduce.reduce.input.buffer.percent | 0.0 | 在 reduce 过程(开始运行 reduce 函数时),内存中保存 map 输出的空间站整个堆空间的比例。 默认状况下,reduce 任务开始前全部的 map 输出合并到磁盘,以便为 reducer 提供尽量多的内存。 若是 reducer 须要的内存较少,能够增长此值以最小化磁盘访问次数 |
在 reduce 端,进行 reduce 函数前,若是中间数据所有驻留内存能够得到最佳性能,默认状况是不能实现的。若是 reduce 函数内存需求不大,把 mapreduce.reduce.input.buffer.percent 参数设置大一些能够提高性能。
今天这章,咱们详细介绍了 Shuffle 过程,关注 Shuffle 过程的性能对整个 MR 做业的性能调优相当重要。通过这章的介绍,咱们可以掌握 Shuffle 过程的关键技术点,虽然还不算深刻。同时,咱们介绍了常见的参数以及调优方法,但愿可以在实际应用中不断的尝试、总结,写出性能最佳的任务。