MapReduce提交job到Yarn的流程学习

Stella981
• 阅读 789

以MapReduce为例,提交一个MapReduce application的大致流程如下,其中Resource Manager简写为RM,Node Manager简写为NM,Application Master简写为AM。

###提交application大致流程

(1)首先client里执行一个MapReduce程序,这个程序运行在client端的JVM里,在main方法中最后有一个job.waitForCompletion(true)方法,当执行这个方法后会触发job.submitJob方法,准备向RM提交一个application。

(2)RM接受到请求后,会为这个application生成一个application +id编号,并且检查输出路径是否已存在,输入输出路径信息是否齐全。不管检查有问题与否,都会给client端返回信息,其包括运行这个job所需要的资源,如运行在哪个NM上,需要的container信息。

一个简单的MapReduce程序中application+id编号示例,测试发现需要hadoop jar运行才显示:

MapReduce提交job到Yarn的流程学习

(3)如果返回的信息提示路径已存在,或者job运行的参数不够,会退出程序,否则可以继续执行这个job,这个时候client端会将程序的jar包,以及运行所需配置信息,以及分片信息发送到HDFS(这些文件保存的上级目录即前面生成的application+id编号,默认会拷贝10份,如果只有3个节点则多余的7份会删除),让jar包和配置信息等保存在各个datanode上,这对分布式集群计算拉取资源来说是有利的,比直接从client端拉取资源会更加高效。

(4)前面准备没问题后,client端向RM提交这个application。RM收到提交后,调度器scheduler将会为它分配container资源,application manager将创建application master。

(5)RM在接受到application提交后,根据资源调度算法计算的结果(包括运行job所在的节点在哪,运行所需要的资源container是多少),会先在计算得到的某个NM上启动一个container,用于启动AM,这个AM是运行MapReduce job前的准备,它启动后后续请求资源就在client端和AM之间进行了。

(6)在客户端执行一个MapReduce程序时,能看到Map和Reduce任务执行的进度百分比,这个是AM在执行initialize job后创建的薄记对象完成的,这个薄记对象会收集运行在分布式各个节点上任务的进度,汇总后定时发送给client。

(7)在执行MapReduce程序时,会先执行Map任务然后再执行Reduce任务(默认是执行Map任务5%后再执行Reduce任务),其中Map任务的个数是由分片数决定的,即通过InputFormat的getSplit方法得到的分片数,这个分片的信息需要从HDFS获取,里面保存的是指向实际分片信息的引用。而Reduce任务的个数则是程序中指定的,通过setNumReduces(num)来指定。

(8)以Map task为例,准备执行Map task时,AM会向RM继续发送请求,即resource request,请求获取计算的NM和container信息。

(9)得到返回信息后,AM会在指定的NM上启动container,并准备执行task程序。

(10)执行task程序部分,是在一个叫做Yarn Child的主类java application中进行的,这个类在执行task程序之前,会向HDFS获取jar包和配置信息。

(11)在获取到HDFS的jar包和配置信息后就开始运行task,如果是map task则输出的key-value对会保存到各自的分区中去,如果是Reduce task则会从对应的map分区中拉取数据准备进行合并、排序和分组,最后执行reduce分组计算并输出到HDFS。不管是Map task还是Reduce Task其都会向AM上报执行情况。

(12)最后执行完MapReduce任务后,保存在分区中的Map输出信息将删除,此外保存在HDFS中的jar包信息、配置信息和分片信息也将删除。

MapReduce提交job到Yarn的流程学习

以上为MapReduce提交job到yarn的过程,后续再补充完善。

参考博文: (1)《hadoop核心权威指南第四版》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这