Yarn的任务提交流程与状态机
任务提交流程(1)
来自:链接:https://www.jianshu.com/p/254d01eaf884
1、job client向ResourceManager提交执行job申请。
2、ResourceManager接收job请求, 生成job id, 返回job id, staging工作目录等信息给job client。
3、Client把资源jar等拷贝到staging工作目录(hdfs /tmp/xxx/yarn-staging/jobId)
4、ResourceManager把job放入工作队列。
5、NodeManager从ResourceManager队列中领取任务。
6、ResourceManager根据job和NodeManager情况, 计算出资源大小,并创建Container。
7、创建MRAppMaster(如果计算框架是MR),运行在Container上。
8、MRAppMaster向ResourceManager注册,向ResourceManager轮询资源。
9、MRAppMaster创建Map, Reduce task任务进程(yarn child)。
10、Map/Reduce任务完成, 然后向ResourceManager注销MRAppMaster进程。
任务提交流程(2)
来自:https://blog.csdn.net/u011331430/article/details/79042329
从第5步开始没有讲的很清楚
任务提交流程(3)
来自:https://blog.csdn.net/u010039929/article/details/74171927
上面这个图是Client向RM提交任务时第一次请求的流程图:
(1) Client通过New Application Request来通知RM中的AsM组件需要提交任务;
(2) AsM一般会返回一个新生成的全局唯一ID,除此之外,传递的信息还有集群的资源状况,这样Client就可 以在需要时请求资源来运行任务的第一个container即AM。
(3) 之后,Client就可以构造并发送ASC了。ASC中包括了调度队列,优先级,用户认证信息,除了这些基本的信息之外,还包括用来启动AM的CLC信息,一个CLC中包括jar包、任务文件、安全token、资源请求以及运行任务过程中需要的其他文件。
经过上面这三步,一个Client就完成了一次任务的请求。之后,Client可以直接通过RM查询任务的状态,在必要时,可以要求RM杀死这个应用。
(1) AM向RM注册,这个过程包括handshaking过程,并且传递一些信息,包括AM监听的RPC端口、用于监测任务运行状态的URL等。
(2) RM中的Scheduler部件做回应。这个过程会传递AM所需的信息,比如这个集群的最大与最小资源使用情况等。AM利用这些信息来计算并请求任务所需的资源。
(3) 这个过程是AM向RM请求资源。传递的信息主要包含请求container的列表,还有可能包含这个AM已经释放的container的列表。
(4) 在AM经过(3)请求资源之后,在稍微晚些时候,会把心跳包与任务进度信息发送给RM
(5) Scheduler在收到AM的资源请求后,会根据调度策略,来分配container以满足AM的请求。
(6) 在任务完成后,AM会给RM发送一个结束消息,然后退出。
在上面(5)与(6)之间,AM在收到RM返回的container列表后,会与每个container所在机器的NM通信,来启动这个container,下面就说说这个过程。
(1) AM向container所在机器的NM发送CLC来启动container
(2)(3) 在container运行过程中,AM可以查询它的运行状态
通过上面的描述,开发者在开发YARN上的应用时主要需要关注以下接口:
ApplicationClientProtocol
Client使用这个协议来与RM通信,来启动一个新应用,检查任务的运行状态或杀死任务
ApplicationMasterProtocol
AM使用这个协议来向RM注册/撤销,请求资源来运行任务。
ContainerManagementProtocol
AM使用这个协议来与NM通信,来启动/停止container,查询container的状态
Job和Applicaiton的状态:
public enum JobStateInternal {
NEW,
SETUP,
INITED,
RUNNING,
COMMITTING,
SUCCEEDED,
FAIL_WAIT,
FAIL_ABORT,
FAILED,
KILL_WAIT,
KILL_ABORT,
KILLED,
ERROR,
REBOOT
}
public enum RMAppState {
NEW,
NEW_SAVING,
SUBMITTED,
ACCEPTED,
RUNNING,
FINAL_SAVING,
FINISHING,
FINISHED,
FAILED,
KILLING,
KILLED
}