Hadoop(七)——中下下

    技术2022-07-11  78

    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因子(不建议)
    Processed: 0.012, SQL: 11