MapReduce——shuffle

Shuffle过程是MR的一个核心。

MapReduce——shuffle

简答了解Shuffle的作用:

MapReduce——shuffle

需求场景:

  在集群环境下,Map task和Reduce task运行在不同的节点上,这个情况下Reduce执行时需要跨节点从其他节点上拉取Map task的输出结果。如果集群上又很多任务在运行,会在运行时消耗很严重的网络资源(这属于正常现象),这种现象无法改变,只能最大化的减少资源的消耗。在数据拉取过程中怎么改变?

  1.完整的从Map task 端拉取数据到Reduce端

  2.在跨节点拉取数据时,尽可能减少对带宽的不必要消耗

  3.减少磁盘IO对Task的影响

shuffle在Map阶段的操作:

  整个流程主要分四部:每个map task都有一个内存的缓冲区,存储着map的输出结果。当缓存区快满的时候需要把缓存区的数据以一个临时文件的方式存储放在磁盘。当整个map task结束之后再对磁盘中map task产生的文件进行合并,生成最终的输出文件,等待Reduce的拉取。

map阶段只能做 加1 的相加操作

把Map输出结果写入到文件,把key value 进行分组相加

  内存缓存区默认100MB。如果map task的输出结果大于100M的时候可能会撑爆内存。所以有一定情况下把临时数据(内存缓存区的数据)写入到磁盘。重新利用这个这块缓存区。内存写入磁盘的过程叫spill(溢写)。默认阈值比例是0.8。当内存数据占用80M的时候锁定这80M的内存。执行溢写操作。Map task的输出结果写入到剩下20M

  Merge阶段:多个map输出文件合并成一个文件的过程就叫merge。如果之前没有设置combiner那么merge阶段也可以对key value进行合并相加

 

决定那个reduce接受咱们map输出结果

 

  MapReduce提供Partitioner接口。它的作用就是根据Key或者value 以及Reduce的数量来决定当前输出数据最终应该交给那个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力。可以用户自己设置

 

--------------

  到此ShuffleMap task阶段的任务就结束了。  简单来说就是不断的拉取当前Job中每个map task的最终结果,然后把从不同地方拉取来的数据进行merge。最终形成一个reduce的输入文件

 

 

 

  Combiner可以把相同的keyvalue相加起来。但是只能用于reduce的输入的key/value与输出的key/value类型完全一致并且不影响结果的展示。比如:累加之类的。   其他场景都会加大消耗。所以一般不建议。

 

 

 

 

接下来就是reduce阶段的shuffle。主要做两个操作。

 

1:拉取数据。Reduce进程启动copy线程,通过HTTP方式请求map task所在的TaskTracker(NM)获取map task的输出文件。

 

2.merge阶段。