一 Job的提交过程
1.1创建Job(我们可以理解为一个需要运行的MapReduce应用程序的作业)
1.2设置Job需要运行的应用程序
1.3校验Job输出路径
1.4设置Mapper类和输入key和输出value的数据类型
1.5设置Reduce类和输入key和输出value的数据类型
1.6Job创建JobSubmitter实例,并调用其submitInternal方法提交应用程序
1.7JobSubmitter在提交的时候会检查文件路径是否存在,否则抛出异常
1.8拷贝运行运行需要的jar包和配置文件到分布式文件系统的MapReduce目录
1.9计算输入分片数量InputSplits
1.10根据分片数量设置map数量
1.11根据CilentProtocol#submitJob方法提交job
1.12构建应用程序提交上下文,并把配置文件信息以及Job的提交的临时目录封装在这个上下文中
1.13调用YarnClient#submitApplication向ResourceManager提交应用程序
二 Job初始化过程
2.1当ResoureManager收到来自客户端的提交请求后,通过调度器Scheduler去分配一个Container,
然后通知NodeManager在这个Container中启动MRAppMaster
2.2MRAppMaster首先会向ResourceManager注册,然后为各个任务申请资源
2.3MRAppMaster是一个服务,在服务启动过程中,会创建Job,并初始化Job,在初始化过程中,会创建分片,然后根据分片信息,确定Map
Task数目和ReduceTask数目
2.4然后创建MapTask & Reduce Task
2.5Job初始化成功,则调用startJob方法启动作业
三 Task的任务分配
3.1启动Job之后,就会对Task进行调度,首先创建TaskAttempt实例,根据任务类型不同会创建不同的TaskAttempt实例
3.2将当前TaskAttempt的id加入到正在运行的TaskAttempt集合in
ProgressAttempts
3.3调度TaskAttempt,触发TA_SCHEDULE事件
3.4RequestContainerAllocator就会向Resource Manager申请conatiner资源:
#首先将MapTask资源需求发送给ResourceManager
#如果ReduceTask达到了调度条件,则开始为ReduceTask申请资源,一般情况是在MapTask完成了5%的比例之后,且ReduceTask可允许占用的资源能够折合成一个整数,则开始调度ReduceTask;如果某一个Map Task已经申请到了资源,则取消其他重复的资源申请;任务运行失败,重新申请资源;如果某一个任务运行速度过慢,则会额外申请资源已启动备份任务;如果某个节点任务失败过多,则会撤销该节点的所有资源请求
四 Task的执行
4.1如果Task已经被ResourceManager分配到了container,MRApp
Master则会告诉NodeManager启动container
4.2然后交给YarnChild类来运行程序,运行Task之前,会定位task需要的jar包,配置文件等
4.3YarnChild运行在一个专属的JVM进程,所以任何一个Map或者
Reduce任务出现问题,都不会影响整个NodeManager
4.4最后完成的数据写入临时文件
五 运行状态和状态更新
六 Job的完成