http://blog.youkuaiyun.com/pursuitbeauty/article/details/38333499 参考这篇
目标:
Shuffle的大致范围就成-怎样把map task的输出结果有效地传送到reduce端。也可以这样理解, Shuffle描述着数据从maptask输出到reduce task输入的这段过程。
· 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
· 减少磁盘IO对task执行的影响。
流程:
在MAP端:
就是MAP输出---》先读到buffer-->>buffer会有一个阀值,一般是百分之八十--->>高过就搬出到硬盘,其他的20继续跑--》》搬出到的80进行排序
最终会生成好多的小文件在硬盘,然后对于这些小文件进行Merge生成一个大的文件,这个文件会保存在硬盘上。
如果这里边有combine,则使用该combine进行设置
在REDUCE:
使用Hashkey,以及reduce个数取模,将Map的输出对应到相应的reduce端上。
copy:
reduce不断启动copy线程,将tasktracker上硬盘的文件进行拉取。
Merge:
然后还会将copy后的文件保存在缓冲区,机制与map一样的。不断Merge,最终是为了生成一个最终的reduce输出文件,这个文件有可能存在内存或者磁盘。
reduce:
然后实行reduce结果,将最终的结果保存在HDFS上面。
感觉MAP与REDUCE上的都一样,不同在于
Map是自己生成好多小文件然后Merge。reduce先merge然后再执行,都会写到相同机制的缓存当中