MapReduce 内部核心工作机制
MapReduce 内部核心工作机制
- 用户编写的 MapReduce 程序提交给 Yarn 集群运行,首先 Job 客户端会根据程序中的输入文件目录去扫描所有文件,并按照文件切片大小(BlockSize,默认 128M)进行切片,切片完成后会将切片信息写入到 ArrayList 集合中,然后进行序列化,最终生成一系列切片文件 FileSplit0、FileSplit1...,这些切片文件保存着切片信息
- AppMaster 会根据切片数量决定启动多少个 MapTask 任务(即 Yarn Chlid 进程名),并告诉每个 MapTask 任务应该读取哪个文件切片
- MapTask 任务启动后,会根据切片信息去相应的位置(本地系统或 HDFS )使用 TextInputFormat 组件逐行读取数据,读完一行数据将产生一对 kv 键值对(其中 k 表示读取数据的偏移量,v 是行内容),这时将调用用户定义的 Mapper 类的 map(k,v,context) 方法,将 kv 键值对作为参数传递进来,并执行用户定义的 map 方法的数据拆分逻辑代码,并通过 context.write(k,v) 产生 kv 键值对
- 产生的 kv 键值对会源源不断的发送到 MapOutputCollector 组件中,这个组件是一个环形结构缓存区(默认 100M),这个结构设计非常精巧,目的是为了尽可能保存更多的 kv 键值对,节约内存空间
- MapOutputCollector 组件不断的往环形缓冲区中写入 kv 键值对,但是不可能无限制写下去,如果写满了就会覆盖之前的内容。所以,达到 80% 时就不能再写了,这时将触发 Spill 组件(溢出)操作
- Spill 组件先对环形缓冲区的 kv 键值对进行由小到大的分区,默认使用 HashPartitioner 分区器进行分区,然后每个分区再进行 按照 Key 值的 compareTo() 方法排序
- Spill 组件分区排序完成后,接着将环形缓冲区中各个分区的 kv 键值对写入到本地磁盘文件中。在这个过程中,MapTask 任务仍然可以继续发送 kv 键值对到环形缓冲区中,因为还有 20% 的空间可用。直到 Spill 组件将环形缓存区所有 kv 键值对全部写入磁盘后,环形缓冲区将释放之前占用的 80% 空间
- 多个分区意味着将写入多个溢出文件到磁盘中,这时则执行合并(Merge)操作,将其合并成一个文件,合并过程中将生成分区索引文件,便有以后 ReduceTask 任务拉取自己分区的数据。合并后的文件存放在 NodeManger 的 Web 服务器的 document 路径下。至此,MapTask 任务结束退出
- ReduceTask 任务启动后,首先到各个 MapTask 所在的磁盘中拷贝自己所在分区的 kv 键值对文件,然后将这些文件进行合并和归并排序
- ReduceTask 任务再调用用户定义的 Reducer 类的 reduce(k,迭代器,context) 方法,这里迭代器每迭代一次,就从文件中读取一对 kv 键值对并赋值给创建的临时 kv 对象,再迭代一次只需要给 kv 对象重新赋值即可,不需要再创建新的 kv 对象
- 文件中所有 kv 键值对读取完之后,通过 context.write(k,v,context) 方法将结果输出,这时将调用 TextOutputFormat 组件的 LineRecordWriter 的 write(k,v) 将结果写入到本地文件系统或 HDFS中,写文件的名称为 part-r-xxxxx,内容格式为 key \t value
- ReduceTask 任务完成后退出
注意:MapTask 生成的数据传输到 ReduceTask 的过程被称为 Shuffle(混洗)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现