当前位置: 首页 > news >正文

MapReduce的shuffle过程详解

shuffle流程概括

因为频繁的磁盘I/O操作会严重的降低效率,因此“中间结果”不会立马写入磁盘,而是优先存储到Map节点的“环形内存缓冲区”,在写入的过程中进行分区(partition),也就是对于每个键值对来说,都增加了一个partition属性值,然后连同键值对一起序列化成字节数组写入到缓冲区(缓冲区采用的就是字节数组,默认大小为100M)。当写入的数据量达到预先设置的阙值后(MapReduce.Map.io.sort.spill.percent,默认0.80,或者80%)便会启动溢写出线程将缓冲区中的那部分数据溢出写(spill)到磁盘的临时文件中,并在写入前根据key进行排序(sort)和合并(combine,可选操作)。溢出写过程按轮询方式将缓冲区中的内容写到MapReduce.cluster.local.dir属性指定的目录中。当整个Map任务完成溢出写后,会对磁盘中这个Map任务产生的所有临时文件(spill文件)进行归并(merge)操作生成最终的正式输出文件,此时的归并是将所有spill文件中的相同partition合并到一起,并对各个partition中的数据再进行一次排序(sort),生成key和对应的value-list,文件归并时,如果溢写文件数量超过参数min.num.spills.for.combine的值(默认为3)时,可以再次进行合并。至此,Map端shuffle过程结束,接下来等待reduce task来拉取数据。对于reduce端的shuffle过程来说,reduce task在执行之前的工作就是不断地拉取当前job里每个Map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge最后合并成一个分区相同的大文件,然后对这个文件中的键值对按照key进行sort排序,排好序之后紧接着进行分组,分组完成后才将整个文件交给reduce task处理。

分区是发生在溢出写过程之前,也就是当满足溢出写条件时,首先进行分区,然后分区内排序,并且选择性的combine,最后写出到磁盘。

【Reducer如何知道自己应该处理哪些数据】

因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition。

【Reducer如何知道要从哪台机器上去的Map输出】

Map任务完成后,它们会使用心跳机制通知它们的Application Master、因此对于指定作业,Application Master知道Map输出和主机位置之间的映射关系。Reducer中的一个线程定期询问Master以便获取Map输出主机的位置。知道获得所有输出位置。

http://www.lryc.cn/news/30571.html

相关文章:

  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)
  • LeetCode笔记:Biweekly Contest 99
  • 初探富文本之CRDT协同实例
  • 团队死气沉沉?10种玩法激活你的项目团队拥有超强凝聚力
  • Spring三级缓存核心思想
  • 深度学习算法训练和部署流程介绍--让初学者一篇文章彻底理解算法训练和部署流程
  • 计算机网络整理
  • 闲人闲谈PS之三十八——混合制生产下WBS-BOM价格发布增强
  • Java 根类 Object
  • 04_Apache Pulsar的可视化监控管理、Apache Pulsar的可视化监控部署
  • 【算法】期末复盘,酒店住宿问题——勿向思想僵化前进
  • Java中的Comparator 与 Comparable详解
  • 计算机科学导论笔记(二)
  • GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音
  • 如何判断树莓派通过GPIO与5G模块成功连接?
  • Java——包装类和List及ArrayList
  • matlab - 程序流程控制、函数文件、特殊函数、调试与优化
  • Toponogov 比较定理及其应用
  • 力扣sql简单篇练习(二十二)
  • 【开源硬件】STM32F030R8T6系统板
  • ES之DSL查询文档基础查询
  • 数据结构与算法之堆排序
  • Vue3 中的模板语法
  • Redis十大类型——Hash常见操作
  • Python采集本地二手房,一键知晓上万房源信息
  • Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法(亲测有效)
  • Java文档搜索引擎总结
  • Linux内核学习笔记——页表的那些事。
  • C++,Qt分别读写xml文件
  • WebStorm安装教程【2023年最新版图解】一文教会你安装