MapReduce的shuffle机制

在这里插入图片描述

shuffle过程

shuffle过程(简单理解):从map的输出到reduce的输入之间的过程。

概念:Map是映射,负责数据的过滤分法,将原始数据转化为键值对;Reduce是合并,将具有相同的key值的value进行处理后再输出新的键值对作为最终结果。为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,Map端的输出作为Reduce的输入的过程叫做Shuffle.

注意点:一个分片对应一个 Map 任务,每个 Map 任务里面会根据分片中的记录执行多次 mapper 函数。一个分区对应一个 reduce 任务,每个 Reduce 任务中根据分区中的键来执行多次 reducer 函数。

1、Map端:每个map任务维护着一个环形缓冲区,用于存储任务的输出,默认100MB。当map输出数据时,先写到内存缓冲区,当内存缓冲区达到设置的阈值之后,始溢出成spill文件,然后进行分区(partion)排序(快速排序),对每个分区的数据按key进行排序,如果有 combiner函数,则会在排序后的输出上运行,使map的输出结果更加紧凑,然后写入磁盘。map任务输出量很大时,可能进行好几次分割,这样spill文件就会分布在不同的磁盘上。当最后一个spill文件写完之后,将多个spill文件进行合并到一个已经分区并排序的大文件,如果有combiner函数,在合并spill时,也会运行。将压缩的Map输出写到磁盘是不错的,可以减少磁盘的IO量,减少传输给的数据量。

2、 Reduce端:Reduce通过HTTP方式从map获取数据, Reduce有少量的复制线程并行从map端复制数据到 Reduce端。一般需要从多个map端复制数据,有一个map完成就可以开始复制了。
如果map输出比较小,会直接复制到内存。如果数据大,当达到内存缓冲区的阈值后,会合并溢出到磁盘。如果有 combiner,合并期间运行,降低写入磁盘的数据量。
最后一次合并结果作为 reduce函数的输入,最后一次合并不一定合并成一个大文件,可能会直接合并到 reduce上。合并因子默认是10,一趟合并的文件数。
对已经排序输出中的每一个键调用reduce函数,然后输出到文件系统(HDFS)。

shuffle的优化方法

shuffle的优化:

  1. 环形缓存区100M调整为200M,溢写的比例从80%调整为90%-95%。增大内存和阈值可以减少溢写的次数。
  2. 产生了大量溢写文件之后进行归并,默认每次归并10个,增大归并的个数(在机器性能范围内)。
  3. Map过程中的combiner相当于Map阶段的Reduce,提前进行一次reduce,数据数量变小,combiner条件是不影响最终业务逻辑,求平均值会影响,而求和汇总不影响。
  4. 归并完数据放入磁盘中,为了减小磁盘IO可以对数据进行压缩,在Map输入、Map输出、Reduce输出时可以进行压缩。Map输入需要支持切片,支持切片的压缩方式有lzo,bzip2,Map输出需要速度快,可以考虑snappy,lzo。Reduce输出如果想让数据永久保存,选择压缩率高的,速度会慢一点,例如bzip2;如果想让Reduce输出端变成下一个MapReduce的输入端,则考虑支持切片,例如lzo,bzip2。
  5. Reduce端拉取数据时,默认一次拉取5个数据,可以增加拉取数据的个数。
  6. 一个MapTask任务内存上限为1G,可以调整为4-6G,ReduceTask同理。MapTask可使用的cpu核心数默认为1,可以增加,ReduceTask同理。每个MapTask和ReduceTask的最大失败可重试次数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值