Hadoop(七)——中下下

shuffle

MapReduce的shuffle分为map阶段的shuffle和reduce阶段的shuffle,下面就分别来做介绍。

map阶段的shuffle:

之前我们学的是map阶段并不是直接把数据给reduce,而是会把数据分好,该分区的分区,该封装的封装,该合并的合并再给到reduce,下面就来详细介绍这个过程。

在这里插入图片描述
1.每一个MapTask都会自带一个缓冲区(默认大小100m)。

2.在缓冲区中会进行分区,排序,合并。

3.缓冲区的大小是固定的,当达到溢出边界(是缓冲区的80%)的时候,缓冲区就会产生溢写操作,
把数据写入磁盘的溢写文件,每次溢写都会产生一个溢写文件。

4.溢写文件都是局部有序整体无序的。

5.当mapTask处理完所有数据后会做一个merge操作会将所有的溢写文件合并,如果缓冲区里也有数据,则会把缓冲区里的数据一起merge到finalout文件中,无论如何,都会产生一个final out 。

6.merge操作:会对整体文件进行分区排序合并,使用的是归并排序。

reduce阶段的shuffle:

这里我们将会知道reduce是如何抓取map中finalout的数据,并且如何输出数据到hdfs上。
在这里插入图片描述
1.当达到启动阈值(默认是0.05,即当有5%的MapTask结束)的时候,ReduceTask就会启动去MapTask抓取数据

2.ReduceTask启动fetch线程通过get请求(携带分区号)的方式来抓取数据,在抓取数据的时候只抓取当前要处理的分区的数据

3.ReduceTask会将抓取来的每一段数据临时存储到本地磁盘上,抓取完成之后,会将这些临时文件merge成一个大文件。在merge过程中,会对数据再次排序。这次排序依然使用的是归并排序

4.merge完成之后,将这个文件中相同的键对应的值分到一组去,形成一个伪迭代器,这个过程称之为分组(group)

5.形成迭代器之后,每一个键调用一次reduce方法

shuffle的优化:

  • 重要 增大缓冲区,实际开发中缓冲区大小一般是250M~400M
  • 增大溢写阈值,可能导致阻塞的风险增加(不建议)
  • 重要 考虑增加Combiner过程,减少数据总量但不改变计算结果
  • 重要 考虑将final out压缩之后再传输,但是解压和压缩过程需要耗费时间和CPU。所以这种方案是在网络资源和压缩时间的取舍
  • 调节ReduceTask的启动阈值(不建议)
  • 重要 适当的增加fetch线程的数量,一般而言这个值会在5000~10000
  • 考虑调大merge因子(不建议)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛像话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值