shuffle

作者: 一个神经质的工程师 | 来源:发表于2020-03-14 14:28 被阅读0次

shuffle:系统执行排序,将map输出作为输入传给reduce的过程称为shuffle。mapreduce确保每个reduce的输入都是按键排序的。

map端

每个map都有一个缓冲区用于任务输出,当到达阀值(默认80%)会写到溢出文件里,最终写到一个磁盘里,在写磁盘前会根据最终的reduce将数据分区排序,排序后运行combiner函数使写到磁盘的数据更紧凑从而减少写的数据量和传输到reduce的数据量。

还可以对map的输出进行压缩,执行参数mapreduce.map.output.compress即可,这样可以使磁盘写入速度变快,节省磁盘空间。

sethive.exec.compress.intermediate=true; 开启hive中间传输数据压缩功能

reducer通过HTTP得到输出文件的分区

reduce端

map的输出文件位于tasktracker本地磁盘。

首先使reduce的复制阶段,在每个任务完成时,reduce任务就开始复制map的输出。如果map的输出很小则输出到reduce的内存,否则还是会输出到磁盘上。随着后台文件增多,后台线程会合并为更大的,排好序的文件,为后续reduce的合并节省时间。

然后是排序阶段。这个阶段合并map的文件,合并的文件数目由参数mapreduce.task.io.sort.factor执行,默认为10.

最后是reduce阶段,将所有的文件合并,之前的合并只是为了满足这个阶段的合并系数。然后输出到文件系统

set mapreduce.output.fileoutputformat.compress=true; 开启mapreduce最终输出数据压缩

配置调优

总的原则是shuffle过程由足够的内存空间。

map端

可以通过避免多次溢出磁盘来获取最佳性能,所以可以优先考虑设置参数mapreduce.task.io.sort.mb,这个参数是排序map所用的缓冲区的大小,单位是m

reduce端

如果reduce函数内存要求不大,主要设置

mapreduce.reduce.merge.inmem.threshold = 0 

mapreduce.reduce.input.buffer.percent 小于1.0 为了减少访问磁盘次数

相关文章

网友评论

      本文标题:shuffle

      本文链接:https://www.haomeiwen.com/subject/pslvshtx.html