标签:ane 重要 reducer 一个 解码器 调优 开始 因此 大数据技术
本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要分为两部分:1. map 任务输出的数据分组、排序,写入本地磁盘 2. reduce 任务拉取排序。由于该过程涉及排序、磁盘IO、以及网络IO 等消耗资源和 CPU 比较大的操作,因此该过程向来是“兵家必争”之地,即大家会重点优化的一个地方,因此也是大数据面试中经常会被重点考察的地方。本文力求通俗、简单地将 Shuffle 过程描述清楚。
包含 Shuffle 过程的 MapReduce 任务处理流程如下图,图片来自《Hadoop权威指南(第四版)》
接下来,分别介绍 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 。
以上便是 reduce 任务前的复制、排序阶段。至此,整个 Shuffle 过程就介绍完毕。
我们在上面介绍 Shuffle 过程时已经提到了一些参数,这里统一整理并说明一下
参数名 | 默认值 | 说明 |
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 过程的关键技术点,虽然还不算深入。同时,我们介绍了常见的参数以及调优方法,希望能够在实际应用中不断的尝试、总结,写出性能最佳的任务。
标签:ane 重要 reducer 一个 解码器 调优 开始 因此 大数据技术
原文地址:https://www.cnblogs.com/duma/p/10704544.html