MR的Shuffle过程以及优化

mr的shuffle过程## 标题
首先shuffle的过程指的是map方法之后以及reduce方法之前
数据从map方法出来以后,首先进入getPartition方法,然后会对数据进行分区,之后进入环形缓冲区(默认大小为100Mb,数据量到达80%时会进行磁盘溢写),在溢写数据时会进行一次快排,这里的快排是对key的索引进行字典顺序排序,溢写之后会产生大量的小文件,(由于在hdfs中,每个文件不论大小,都会固定占用150字节的系统空间,因为文件或者文件夹是以对象形式存储在hdfs上的),所以我们要在快排之后在进行一次归并排序,来减少小文件个数,之后把数据按照指定的分区放入对应的分区下,来等待reduce的拉取。
reduce会拉取指定的分区内的文件,先进入内存,如果内存不足,之后会对数据进行落盘,从而防止数据丢失,而且不管是内存中的数据还是说落盘的数据,都要再进行一次归并排序,(也可以再进行一次分组排序)之后就进入到reduce方法。
对于shuffle过程的优化
1.因为环形缓冲区的大小是可以进行调整的,而100mb的大小在通常情况下是不够用的,所以我们可以调整到200mb左右,而且它的阈值80%也是可以调整的,我们可以调整到90%-95%左右,这样可以减少刷写次数,从而提升效率。
2.溢写之后的文件归并,默认是一次十个文件,如果说实际情况中机器性能允许的话,我们可以适当增大一次归并处理的文件个数。
3.在溢写之后,mr还有一个组件combine,它是对于数据提前做一次聚合,即把多个<key,value>合并成<key3,value3>有几个就是key几的形式,这样就减少了之后的磁盘IO从而减少时间。但是combine有一个前提,就是不能对后续的业务逻辑产生影响,比如求和,就不会有影响,而要是一些复杂的逻辑,就容易产生影响,导致数据不准确。
4.压缩,这个是比较有效的可以减少IO的方式,mr过程可以有三处压缩,但是在shuffle过程中有一处,就是在map方法刚出来时,对数据进行压缩,一般选用的压缩方式是snappy和lzo两种压缩方式,因为这两种压缩的速度相对较快。
5.reduce的拉取,默认一次只拉取5个maptask上的数据,如果机器性能允许的话,我们可以适当调大一次拉取的个数,从而提高效率。
6.默认的maptask和reducetask大小都是1G,通常情况下我们会调成四五个G左右,而集群单个节点和每个任务默认内存都是8G,这个我们要根据实际情况进行调整,如果说我们的机器是8G的,那要调整到五六个G左右,如果我们是256G的,那么我们就要调整到200G左右。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值