Shuffle机制及优化

时间:2024-04-05 09:52:14

1. Shuffle机制

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。
Shuffle机制及优化
Shuffle阶段主要做的事情:

  1. map方法处理后得到的一系列新的key/value会先经过Partioner的分区方法,标记分区,然后进入环形缓冲区
  2. 在环形缓冲区中进行分区和排序,环形缓冲区左侧写数据,右侧写索引
  3. 环形缓冲区默认100m,默认到达80%时溢写,溢写前对数据的key的索引按照字典序,进行快速排序
  4. 对溢写的文件进行归并排序,然后将结果放到相应的分区再进行排序,最后等待Reduce端拉取数据
  5. Reduce首先拉取数据到内存中,内存不够,再溢写到磁盘中,然后将内存和磁盘中的数据进行归并排序,此时可以进行一次分组排序,最后写入到reduce方法

2. Shuffle阶段的优化

  1. 调整环形缓冲区到200m,同时溢写比例增大到90%-95%,目的为了减小溢写次数
  2. 默认归并10个溢写文件,在机器的性能允许的前提下可增大为15-20个,减小溢写文件个数
  3. 归并溢写文件的过程中,在不影响业务逻辑的前提下对数据进行combiner,对MapTask的输出进行局部汇总,以减少网络传输量
  4. 归并完成后,放到对应的磁盘时,可以对文件进行压缩,减小文件大小
  5. Reduce拉取对应分区的数据时,默认一次拉取5个,在机器性能允许的前提下可以增加拉取个数
  6. Reduce拉取数据所存放的内存空间在条件允许的条件下也可以增大
  7. 每个MapTask和ReduceTask默认的可使用的内存大小为1G,可以调整为4-6G
  8. 每个MapTask和ReduceTask的最大允许失败重试次数和超时时间也可以调整

3. MapReduce中能进行压缩的地方

  • Map的输入:压缩后要保证能进行切片,支持切片的压缩方法(LZO,bzip2)
  • Map的输出:压缩速度要尽可能的快,速度快的压缩方法(Snappy)
  • Reduce输出:
    • 如果输出想要永久保存,选择压缩率最高的,但是压缩速度会慢一些,比如Gzip
    • 如果输出要作为下一个MapReduce的输入,要考虑支持切片的压缩方法