全方位揭秘!大数据从0到1的完美落地之Shuffle和调优
发布网友
发布时间:2024-10-06 16:30
我来回答
共1个回答
热心网友
时间:2024-10-29 14:01
MapRece高级shuffle阶段概述
MapRece确保每个recer的输入数据按键排序,shuffle阶段负责从map方法输出数据到作为输入数据传给rece方法的过程。shuffle是MapRece的“心脏”,是奇迹发生的地方,不断被优化和改进。
Map端
map方法开始产生输出数据时,不直接写入磁盘,而是利用缓冲机制在内存中进行预排序。每个map任务都有一个环形内存缓冲区存储输出数据,默认大小为100MB,可调整maprece.task.io.sort.mb属性。当缓冲区内容达到80%阈值(maprece.map.sort.spill.percent属性控制),后台线程开始将数据溢写到磁盘,由maprece.cluster.local.dir指定位置。溢写过程中,map输出继续写入缓冲区,直至写磁盘过程完成。
数据溢写到磁盘前,后台线程会按分区器逻辑对数据进行排序(QuickSort默认为字典顺序),并可选使用combiner函数压缩数据,减少写磁盘量和传递给recer的数据。每次溢写后,生成一个溢出文件,多个溢出文件在MapTask完成前被合并成一个已分区且已排序的输出文件。配置属性maprece.task.io.sort.factor控制一次最多合并的文件数。
若溢出文件数量达到3个(maprece.map.combine.minspills控制),会在写入磁盘前再次运行combiner。combiner运行不改变最终结果,只在数据量减少时调用。
数据在溢写过程中进行压缩(maprece.map.output.compress=true,maprece.map.output.compress.codec设置压缩库)以提高效率。
环形缓冲区详解
Rece端
recer通过HTTP获取分区文件,工作线程数量由任务的maprece.shuffle.max.threads属性控制。map输出文件位于运行MapTask的本地磁盘,rece任务需要并行获取多个map任务的map输出作为输入。
recer知道获取map输出的主机位置,通过心跳机制得知map任务完成时间。主机不会立即删除map输出,直到application master告知删除,以避免重复工作。
小map输出复制到JVM内存(由maprece.rece.shuffle.input.buffer.percent属性控制),大输出复制到磁盘,内存缓冲区达到阈值(maprece.rece.shuffle.merge.percent)或输出阈值(maprece.rece.merge.inmem.threshold)时,合并溢写到磁盘。
后台线程合并多个磁盘上的溢写文件为大排序文件,减少后续合并时间。压缩的map输出需在内存中解压缩。
复制完所有map输出后,rece进入排序阶段合并数据,保持顺序。此过程循环进行,最终将数据输入rece函数。
shuffle流程总结
combiner函数
combiner函数优化MapRece执行效率,减少磁盘IO和网络传输。注意,不适合进行求平均值等需求,可能影响结果。
资源相关参数
应配置在mapred-site.xml中生效。
容错相关参数
本地运行MapRece作业设置。
效率和稳定性相关参数