美文网首页大数据
hadoop中shuffle过程详解

hadoop中shuffle过程详解

作者: 会飞的大象 | 来源:发表于2016-12-19 19:03 被阅读1268次

    先上图:

    shuffle过程.png

    shuffle的过程大致范围是:map task开始到reduce task开始其中分成map端和reduce端

    1. map端shuffle执行顺序
      maptask 执行过程中会不断的产生数据。在这些数据开始产生到最终完成经历的过程如下:
      1. 分区 partition。可以通过Partitioner的子类来自定义分区行为。默认是通过key的hashcode模除以reduce的任务数。分区的目的是平均reduce的处理任务
      2. 缓存 buffer。map在内存中有一个环形缓冲区,默认是100M,它有个溢出比例spill percent可以设置,默认是0.8,也就是说80%的容量用来缓存,当这部分容量满了的时候会启动一个溢出线程进行溢出操作,在溢出的过程中,仍然可以利用剩余的20%对新生产的数据进行缓存。
      3. 溢出 spill、排序 sort、combiner。当缓存已满时,溢出线程开始启动前,需要对这80%的数据做快速排序。同时由于可能产生许多相同key的数据,例如:“aaa 1"、"aaa 1"、"aaa 1",如果job中指定了combiner,则可以先进行相同key的合并,得到 ”aaa 3"这样的结果,这样可以对结果进行优化。需要注意的是使用combiner时必须是reduce的输入和输出类型一致,且不会影响最终结果。combiner其实可以看做是一个map端的reducer。一个溢出线程完成时会产生一个已经排序、combiner优化(combiner过程可选)并且包含分区信息的临时文件。
      4. 合并 merge。当map任务执行完后,如果数据量不是太小,会生成多个临时的溢出文件,假设临时文件如下:splill1("aaa 1" "bbb 3")、spill2("aaa 3" "bbb 5")、spill3("aaa 5 "bbb 2")。因为每个map task生成的最终文件只有一个,因此会对这些临时文件进行merge,这个过程中会使用归并排序,并且如果指定了combiner,也会进行combiner的操作。merge后的结果{"aaa",[1,3,5]}、{“bbb",[3,5,2]},如果指定了combiner对结果相加的话,那么结果是{”aaa",9}{"bbb",10}。merge完成会得到最终的文件
    2. reduce端
      当有map task完成后,yarn会告知reducer拉取(fetch)任务,在所有的map任务完成之前,reducer都是在重复的拉取数据、merge。过程如下:
      1. copy过程。启动copy线程(Fetcher)拉取数据
      2. merge阶段。和map端的merge类似,只是数据的来源是从不同map端copy过来的。copy过来的数据也会首先进入内存缓存,只是这里的内存大小要比map端的更灵活,它基于JVM的heap size设置。当copy数据过来时,就会进入内存缓存,内存缓存满了就溢出成临时文件,溢出过程同map端,当所有map任务结束后,所有的溢出文件merge成最终文件。

    至此。shuffle过程结束。

    相关文章

      网友评论

        本文标题:hadoop中shuffle过程详解

        本文链接:https://www.haomeiwen.com/subject/ffwtvttx.html