一 、shuffle简介
什么是shuffle
一句话:Reducer端获取Mapper端的数据的过程
二、shuffle工作流程
1.Map读取输入文件
------>进行map计算
------>Mapper将数据写入到环形缓冲区
注意:1.一个Mapper对应一个环形缓冲区
2.环形缓冲区存在于内存中,默认100M,mappered-site.xml中可以配置值
------>当环形缓冲区中内容超过80%(默认阈值时0.8)时,后台线程开始把内容写向磁盘的小文件中(spill过程)
------>当一个小文件满了之后,开始写向下一个小文件
注意:写向磁盘的小文件之前会对Mapper中数据进行Partitioner分区(HashPartitioner)
---> 小文件中对每个分区按照分区号进行排序'
--->再对小文件中每个分区中的内容按键(key)进行内排序,
---> 如果有combiner(combiner可有可无),则会在排序后进行combiner运算
------>然后将所有小文件合并成一个大文件,相同分区号的进行合并
------>合并成一个大文件后再次进行排序
最终得到一个分区且排序的大文件,Mapper的任务完成
2.每个Reducer对应一个分区号,(0号Reducer对应0号分区的内容,1号Reducer对应1号分区的内容......)
------> Ruducer从大文件中去读取相应分区的文件
------>(每个Mapper会产生一个大文件,故读取后会到很多文件)然后进行合并
------>排序
------>给Reducer计算
------>输出
三 、shuffle拉取数据过程
在上文中提到“Ruducer从大文件中去读取相应分区的文件”,那么问题来了,那么多map产生的文件,reducer如何知道去哪一个map中的哪一个分区中去拉取数据呢?
ResourceManager会告诉NodeManager开始工作
------>NodeManager此时启动子进程yarnChild
------>ResourceManager会与MrAppMaster进行RPC通信,(MrAppMaster会分配到其中一个yarnChild所在的机器上)ResourceManager要求MrAppMaster启动任务监控进程
------>MrAppMaster会向ResourceManager申请资源
------>MrAppMaster会启动yarnChild子进程开始进行工作
------>执行Map任务的yarnChild会向MrAppMaster汇报输出信息(如Mapper完成后的数据存储在哪台机器,哪个分区,每个分区的偏移量等映射关系)
------>其他机器的Reducer会向MrAppMaster询问这种映射关系
------>根据映射关系,Reducer知道去哪台机器,哪个分区,哪个偏移量中获取数据
------>开始去相应的分区中下载数据,进行Reducer计算