MapReduce任务在hadoop集群上的运行流程原理:提交给yarn后
job 提交之后交给 YarnRunner
-
YarnRunner 向 resourcemanager 申请一个应用 Application,
-
resourcemanager 返回该 Application 的资源路径给 YarnRunner
-
YarnRunner 将job运行需要的资源传给 HDFS
-
任务提交后会生成job.split、job.xml、jar包
-
有需要的时候下载到nodemanager的container
-
-
YarnRunner资源提交完毕,向 resourcemanager 申请运行 mrApplicationMaster
-
resourcemanager 将用户请求初始化为一个Task,放在资源调度器中等待空闲的nodemanager
-
空闲的nodemanager领到Task
-
nodemanager创建container、下载资源、产生 mrApplicationMaster
-
mrApplicationMaster
- 计算MapTask数量:切片的数量就是maptask的数量
- 向 resourcemanager 申请运行maptask的容器
-
resourcemanager 将maptask任务发给空闲的nodemanager
- nodemanager的数量取决于maptask任务的数量
- nodemanager领到任务后,创建容器
-
mrApplicationMaster发送程序启动脚本给领到maptask任务的nodemanager
-
nodemanager启动MapTask,对数据进行分区排序
-
以下为 map阶段详细流程
-
1 根据切片数量安排,数据按inputformat将<K,V>传给服务器
2 map输入数据<K,V>在mapper中进行逻辑运算,
- 经历map()方法,最后context.write(K,V)输出数据
3 map输出的数据被outputColletcor收集起来
- 如果存在分区,产生分区号,从0开始,依次递增
4 数据写入环形缓冲区(内存)
- 数据写入超过80%则溢写,20%仍有写入则反向写入
5 溢出的数据在内存中分区排序,最终溢写到文件
- 分区排序:快排,强制。默认情况下是系统分区,无法确定数据分到哪个区
- 溢写的文件:分区且区内有序
6 溢写的文件可能有多个,进行merge归并排序
- 多个文件合并为1个文件,按区号合并
7 Map Task任务完成
-
mrApplicationMaster 向 resourcemanager 申请容器来运行Reduce Task任务
-
resourcemanager 分配nodemanager领取Reduce Task任务
- Reduce Task数量与分区数量一致
-
reduce 从 map 获取相应的分区数据
-以下为 reduce阶段详细流程
1 Reduce Task根据自己的分区号,获取相应的数据
- 分区号一致的进入一个Reduce Task
2 在Reduce Task中进行merge归并排序
3 数据一次一组进入 reducer,key值相同的为一组
4 reducer的reduce()方法处理完之后,outputformat
5 最终数据输出到本地
- 程序运行完毕,mrApplicationMaster 向resourcemanager 申请注销自己