8/31
2.2.1 MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
Mr AppMaster:负责整个程序的过程调度及状态协调。
MapTask:负责Map阶段的整个数据处理流程。
ReduceTask:负责Reduce阶段的整个数据处理流程。
由上图可知,这个程序有3个MapTask 和 2个ReduceTask
2.2.2 数据切片与MapTask并行度
MapTask个数(并行度)等于切片数
一个Job的Map阶段并行度由客户端在提交Job时的切片数决定
每一个split切片分配一个MapTask并行实例处理
默认情况下,切片大小=BlockSize(老版本是64M,新版本是128M)
切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
由上图可知,该程序一共有两个文件。第一个文件是200M,所以被切分成了两个切片;第二个文件是100M(小于128M),单独为一个切片。
2.2.3 分区机制与ReduceTask并行度
ReduceTask个数(并行度)默认等于ReduceTask的进程数
当自己设定分区数时
job.setNumReduceTasks(n):设置分区数
getPartition:自定义所取分区数
分区机制
如果ReduceTask的数量 > getPartition的结果数,则会多产生几个空的输出文件part-r-000xxx;
如果1 < ReduceTask的数量 < getPartition的结果数,则有一部分分区数据无处安放,报错;
如果ReduceTask的数量=1,则不管MapTask端输出多少个分区文件,最终结果都交给这一个ReduceTask,最终只产生一个结果文件part-r-00000;
分区号必须从零开始,逐一累加。
案例分析
例如:假设自定义分区数为5,
job.setNumReduceTasks(6);大于5,程序正常运行,多产生几个空的输出文件
job.setNumReduceTasks(2);报错;
job.setNumReduceTasks(1),正常运行,最终只产生一个输出文件;
由上图可知,该程序自定义分区,将把结果按单词首位(a-p)、(q-z)输出到两个文件中,ReduceTask个数默认为2。
2.2.4 排序
排序概述
排序是MapReduce框架中最重要的操作之一
MapTask和ReduceTask均会对数据按照key进行排序。该操作是Hadoop的默认行为。任何应用程序中的数据均会被排序,而不是逻辑上是否需要。
默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。
排序分类
部分排序:MapReduce根据输入记录的键对数据集排序,保障输出的每个文件内部有序。
全排序:最终输出结果只有一个文件,且文件内部有序。
辅助排序(GroupingComparator):在Reduce端对key进行分组
二次排序:在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序
2.2.5 MapReduce过程描述
MapReduce运算程序一般需要分成2个阶段:Map阶段和Reduce阶段;
Map阶段的并发MapTask,完全并行运行,互不相干;
Reduce阶段的并发ReduceTask,完全互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出;
MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
注:MapTask如何工作、ReduceTask如何工作等若干问题细节下面会继续介绍
2.3 MapReduce工作机制
MapReduce详细工作流程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?