MapReduce之奇迹发生的地方:shuffle
出处:http://langyu.iteye.com/blog/992916#comments
hadoop核心:MapReduce原理。
MR的核心是shuffle,被称为奇迹发生的地方。
shuffle,弄乱,洗牌的意思。partition 分区,sort 排序,spill溢出,disk 磁盘
下面是官方对shuffle的配图: phase 阶段,fetch 最终,merge 合并
看不懂没关系,心里有个印象就行。
下面说说我们对shuffle过程的期望:
1,完整的从map task端把数据拉取到reduce端。
2,在跨节点拉取数据时,尽可能减少对带宽的不必要消耗。
3,减少磁盘IO对task执行的影响。
详细配图,shuffle过程的map 端 :
首先,我们要知道是,每个map task 都有一个环形缓冲区在内存memory中,用来存储map的输出结果。然后,当达到80%的时候,就会形成一个临时文件,存储到磁盘。当整个map结束,再对磁盘上的所有文件进行Merge合并生成“最终文件”。等待Reducer拉取。
1,数据来源HDFS上的block块,block与split可以多对一,默认的是一对一的关系
2,数据经过map task执行后,形成K/V对。同时在这里就开始进行分区partition。以及,key,value,partitions,被序列化成字节数组,也就是说落到磁盘上的是字节数组
分区partition:是对key进行hash取值,然后对reduce task数量取模。进行的分区
3,spill溢写到磁盘的数据,是sort有序的。combiner:如果有很多a,1 a,1 a,1这种数据,会有一个combiner过程,相当于在一个map task上进行reduce,只不过reduce只允许在最后阶段那一端称呼,所以在这里只能叫combiner,功能是一样的。
4,就是溢写到disk磁盘上的临时小文件《也就是那一个个“80%”的溢写临时小文文件》,会进行一个Merge合并。最终在每一个map task上,都Merge成一个文件,这个文件也就是reduce一直在拉取的map task的最终结果
在map task进行时,reduce task会一直联系它,问它完成了没。
详细配图,shuffle过程的reduce 端:
1,map task结束后,reduce会启动一些数据copy线程Fetcher取样器。通过HTTP请求到map task 端的task tracker,获取到map task端的输出文件。
2,继续Merge,这个Merge是把多个从map task端copy过来的数值进行Merge合并。
Merge的方式有三种:内存到内存 《不启用》
内存到磁盘 《一直在进行》
磁盘到磁盘 《生成最终的文件》
3,在磁盘上merge后形成“最终文件”,当这个reduce task的最终文件确定下来,那么整个shuffle也就结束了,执行Reducer,结果放到HDFS上。
小鸟刚起步,看大神写的之后,自己的简单领悟总结。有不对的欢迎留言指正。
赠人玫瑰,手有余香!