Shuffle过程详解

Shuffle过程简介

       所谓Shuffle,是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程。因此,Shuffle过程分为Map端的操作和Reduce端的操作。

这里写图片描述

(1)在Map端的Shuffle

       Map的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序和合并,之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并成一个大的磁盘文件,然后通知相应的Reduce任务来领取属于自己处理的数据。

(2)在Reduce端的Shuffle过程

       Reduce任务从Map端的不同Map机器领回属于自己处理的那部分数据,然后对数据进行归并后交给Reduce处理。

Map端的Shuffle过程

这里写图片描述

1、数据分片 
2、运算结果写入缓存 
3、缓存达到阈值,溢写到磁盘文件 
溢写前会进行分区,分区内排序和合并(可选) 
4、归并成大文件 
每次溢写会生成一个溢写文件,这些溢写文件最终需要被归并成一个大文件。 
归并的意思:生成key和对应的value-list。 
文件归并时,如果溢写文件数量超过参数min.num.spills.for.combine的值(默认为3)时,可以再次进行合并

  • 每个Map任务分配一个缓存
  • MapReduce默认100MB缓存
  • 设置溢写比例0.8
  • 分区默认采用哈希函数
  • 排序是默认的操作
  • 排序后可以合并(Combine)
  • 合并不能改变最终结果
  • 在Map任务全部结束之前进行归并
  • 归并得到一个大的文件,放在本地磁盘
  • 文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner,少于3不需要

合并(Combine)和归并(Merge)的区别: 
两个键值对<“a”,1><“a”,1>,如果合并,会得到<“a”,2>,如果归并,会得到<“a”,<1,1>>

Reduce端的Shuffle过程

这里写图片描述

1、领取数据 
2、归并数据 
3、数据输入给Reduce任务

  • Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
  • Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的
  • 当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce

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

1、数据溢写,分区,排序 
        多个map并行工作相互不影响,每个map工作结束后会将输出的key-value对先存储在内存(memory)缓存区中,当内存缓冲区中数据的数量达到一定量后会将内存缓冲区中的数据溢写(spill)到本地磁盘中,此时可能会将内存缓冲中的数据写到多个磁盘文件中,再将数据写到磁盘文件的过程中,会对数据进行以下操作: 
(1)分区:因为shuffle过程结束后,在reduce过程中,多个reduce会拉取map输出的数据并执行reduce操作,此时一个reduce         会对应一个分区,即,不同的reduce处理不同分区的数据。所以此处的分区可以理解为:通过分区后,输出有多个文件,但是不同文件中存储的数据都是够被同一个reduce处理的数据,或者同一文件中的数据按照不同分区进行分开存放。 
(2)将各个分区(文件)中的数据按照key进行排序。

2、文件合并 
       当map输出的数据全部写到磁盘后,会合并小文件(merge),将上一过程中输出的多个小文件进行合并,在合并的过程中也会进行分区和排序,同之前一样,分区即是把能被同一个reduce操作的数据放在一起,排序即是在各个分区中将数据按照key进行排序。此时通过合并,分区,排序后生成的大文件存放在map程序本机的本地磁盘,并等待reduce来拷贝数据。

3、Combiner和压缩 
当执行到此处,可以进行以下两个可设置的操作: 
(1)Combiner(map端的reduce),文件合并的时候,可以执行reduce端操作(将相同key的value合并在一起),这种操作不是每个reduce程序都可以进行,只有不影响最终结果的情况下,才能够进行Combiner操作。 
(2)压缩:在此处可以将合并后的大文件进行压缩,压缩后可以减少磁盘的占用量,当reduce copy时也可以减少网络IO。

4、reduce数据copy 
接下来reduce task会到map task运行的主机上拷贝自己要处理的数据。具体的过程如下 
(1)先将数据放内存缓冲区,缓冲区写满后溢写到磁盘。 
(2)溢写磁盘的过程中,会将拷贝的数据进行合并,排序处理。 
(3)group:在数据copy结束并合并结束后,将拷贝的数据进行按照key进行分组,即,将相同key的value放在一起,这里通过比较器进行比较key是否相同。 
(4)将分组后的数据传递给reduce()方法进行处理 

猜你喜欢

转载自blog.csdn.net/u012580143/article/details/84615695