shuffle流程图
- Shuffle概念
系统执行排序, 将map输出作为输入传给reducer的过程被称为shuffle, 从很多方面看, shuffle是MapReduce的灵魂所在. 学习shuffle有利于我们理解MapReduce的工作机制, 优化MR程序.
- Map端的Shuffle
要进行海量数据处理, 外存文件的I/O访问为成为一个制约系统性能的重要瓶颈. 而Hadoop在Map过程实现的一个重要原则就是: 计算靠近数据, 这主要分为两个方面:
代码靠近数据:
a) 本地化数据处理(locality), 即一个计算节点尽可能处理本地磁盘上的数据
b) 尽量选择数据所在的DataNode启动Map任务
数据靠近代码:
a) 当本地没有数据处理时, 尽可能从同一机架或最近节点传输数据进行处理(host选择算法)
-
写入环形缓冲区
因为频繁的磁盘I/O会严重减低效率, 所以中间结果不会被马上写入磁盘, 而是优先存储到map节点的环形缓冲区, 并作一些预排序提高效率.
环形缓冲区:
缓存中有一个阈值比例的配置, 当达到整个缓存的比例时, 会触发溢写操作, 在触发溢写操作的时候, map还是会往剩下的内存空间继续写入, 直到写满时map任务锁定, 数据都溢写到磁盘中. 而这个到达阈值后的继续写入使用到了折行写wrap方法, 程序会判断缓存的满是不是真的满, 如果前面还有空间, 在”写满”缓存后会从前面继续写, 直到完全写满, 这就是”环”的意思. 而这个环的意义就在于可以让写缓冲和溢写并行操作, 节省时间.
环形缓冲区的源码解析: