文章目录
- 作业在 Yarn 上的执行的流程
-
- AppMaster 的启动流程
- 作业执行
-
- 应用资源申请 AM - RM
- 应用资源分配 NM - RM
- 作业结束
作业在 Yarn 上的执行的流程
AppMaster 的启动流程
-
客户端申请 job id
-
客户端提交job到 ResourceManager,
-
通过 RMStateStore 存储 Job 的提交信息(信息包括 启动作业的jar包、配置文件,AM 的资源以及启动 AppMaster 的参数)
-
当 Job 信息存储完后,App 状态变为 SUBMITED,然后在调度器中创建对应的 App,并添加到调度器的集合中
public class SchedulerApplication<T extends SchedulerApplicationAttempt> { private Queue queue;private final String user;private T currentAttempt; }
-
然后创建一个 App 的一次尝试 AppAttempt
-
将 AppAttempt 添加到调度器中,并更新调度器中 APP 的当前尝试
-
之后会为应用程序的 ApplicationMaster 申请资源,该资源描述如下:
<AM_CONTAINER_PRIORITY, ResourceRequest.ANY, appAttempt.getSubmissionContext().getResource(),1>
即一个优先级为 AM_CONTAINER_PRIORITY(值为0)、可在任意节点上、资源量为X(用户提交应用程序时指定)的Container。
-
当调度器为 AppMaster 分配资源后,会把当前的 AppAttemp 的信息存储到 RMStateStore 中,存储完成后会去启动 AppMaster
-
AppMaster 的启动由 ApplicationMasterLauncher 来完成,在对应的节点上启动 AppMaster,启动之后会向 AMLivelinessMonitor 注册 APPMaster,以监控其运行状态。
AMLivelinessMonitor AM 过期时间默认为 10 分钟,每隔过 expireIntvl/3 检查一次是否有 AM 过期
-
AppMaster 启动后通过 RPC 函数 ApplicationMasterProtocol#registerApplicationMaster 向ResourceManager 注册,此时会在 AMLiveLinessMonitor 中更新心跳时间,并记录 AppMaster Web 服务的 URL,以便能从 Yarn UI 跳转至 MRAppMaster UI。
-
之后 作业就进入了 RUNNING 状态。
作业执行
应用资源申请 AM - RM
-
AppMaster 向 ResourceManager 注册后,通过心跳向 ResourceManager 请求资源,
心跳中包含的信息包括:资源需求描述、待释放的Container列表、请求加入黑名单的节点列表、请求移除黑名单的节点列表等。
-
当 ResourceManager 的 ApplicationMasterService 收到先到后,会先更新 AMLivelinessMonitor 中更新 AppMaster 的最近更新时间 和 更新黑名单列表。
-
释放待释放 Container
-
将新的资源请求更新到调度器对应的数据结构中
-
返回为该应用新分配的资源。
应用资源分配 NM - RM
- NodeManager 通过心跳向 ResourceManager 汇报各个Container 运行状态。
- 当 ResourceManager 收到心跳后,会更新该 NodeManager 上各个Container 的运行状态
- 如果该节点上有可分配的空闲资源,则会在该节点上进行一次资源分配,而分配后的资源仅记录到对应的数据结构中,等待 APPMaster 下次通过心跳机制领取。
作业结束
- 当作业运行结束后,AppMaster 会向 ResourceManager 注销自己
- 开始聚集作业的日志,并上传 HDFS