本篇结构:
- YARN-Client 工作流程图
- YARN-Client 工作流程
- YARN-Client 模式启动类图
- YARN-Client 实现原理
- YARN-Client 作业运行调用图
一、YARN-Client 工作流程图
二、YARN-Client 工作流程
- 启动运用程序,main 函数方法中会启动 SparkContext,在 SparkContext 启动过程,会构建 DAGScheduler,利用反射构建 YarnScheduler(TaskScheduler)和 YarnClientSchedulerBackend(SchedulerBackend)。YarnClientSchedulerBackend 内部又会启动 YarnDriverEndpoint 和 Client,接着 Client 向 Yarn 集群的 ResourceManager 申请启动 ApplicationMaster。
- RM 收到请求,在集群中选择一个 NodeManager,为该应用程序分配第一个 Container,在该 Container 中启动应用程序的 ApplicationMaster(AM),和 YARN-Cluster 不同,YARN-Client 在 AM 中不运行 SparkContext,只与 SparkContext 进行联系进行资源的分派。
- 客户端的 SparkContext 启动完毕后,与 AM 建立通信,向 ResourceManager 注册,根据任务信息向 RM 申请资源(Container)。
- 一旦 AM 申请到资源(即 Container)后,便与对应的 NodeManager 通信,要求它在获得的 Container 中启动 CoarseGrainedExecutorBackend ,CoarseGrainedExecutorBackend 启动后会向客户端的 SparkContext 注册并等待接收任务集。
- 客户端的 SparkContext 分配任务集给 CoarseGrainedExecutorBackend 执行,CoarseGrainedExecutorBackend 运行任务并向终端点 YarnDriverEndpoint 汇报运行的状态和进度,让客户端随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
- 程序运行结束后,客户端 SparkContext 向 RM 申请注销并关闭自身。
三、YARN-Client 模式启动类图
先大致画个 YARN-Clinet 运行模式应用程序启动类图:
四、YARN-Client 实现原理
-
SparkContext 启动时,通过 createTaskScheduler 构建 TaskScheduler 和 SchedulerBackend 两个对象,具体在 YARN-Client 模式,创建 TaskScheduler 实现 YarnScheduler 和 SchedulerBackend 实现 YarnClientSchedulerBackend。其中 YarnScheduler 完全继承 TaskSchedulerImpl,只重写了 getRackForHost() 方法。来看 SparkContext # createTaskScheduler:
... case masterUrl => // 对于 Yarn 模式,获取的是 YarnClusterManager val cm = getClusterManager(masterUrl) match { case Some(clusterMgr) => clusterMgr case None => throw new SparkException("Could not parse Master URL: '" + master + "'") } try { val scheduler = cm.createTaskScheduler(sc, masterUrl) val backend = cm.createSchedulerBackend(sc, masterUrl, scheduler) cm.initialize(scheduler, backend) (backend, scheduler) } catch { case se: SparkException => throw se case NonFatal(e) => throw new SparkException("External scheduler cannot be instantiated", e) } ...
分别具体看 createTaskScheduler,createSchedulerBackend:
YarnClusterManager # createTaskScheduler:
o