【Spark】Spark 运行架构--YARN-Client

本篇结构:

  • YARN-Client 工作流程图
  • YARN-Client 工作流程
  • YARN-Client 模式启动类图
  • YARN-Client 实现原理
  • YARN-Client 作业运行调用图

一、YARN-Client 工作流程图

二、YARN-Client 工作流程

  1. 启动运用程序,main 函数方法中会启动 SparkContext,在 SparkContext 启动过程,会构建 DAGScheduler,利用反射构建 YarnScheduler(TaskScheduler)和 YarnClientSchedulerBackend(SchedulerBackend)。YarnClientSchedulerBackend 内部又会启动 YarnDriverEndpoint 和 Client,接着 Client 向 Yarn 集群的 ResourceManager 申请启动 ApplicationMaster。
  2. RM 收到请求,在集群中选择一个 NodeManager,为该应用程序分配第一个 Container,在该 Container 中启动应用程序的 ApplicationMaster(AM),和 YARN-Cluster 不同,YARN-Client 在 AM 中不运行 SparkContext,只与 SparkContext 进行联系进行资源的分派。
  3. 客户端的 SparkContext 启动完毕后,与 AM 建立通信,向 ResourceManager 注册,根据任务信息向 RM 申请资源(Container)。
  4. 一旦 AM 申请到资源(即 Container)后,便与对应的 NodeManager 通信,要求它在获得的 Container 中启动 CoarseGrainedExecutorBackend ,CoarseGrainedExecutorBackend 启动后会向客户端的 SparkContext 注册并等待接收任务集。
  5. 客户端的 SparkContext 分配任务集给 CoarseGrainedExecutorBackend 执行,CoarseGrainedExecutorBackend 运行任务并向终端点 YarnDriverEndpoint 汇报运行的状态和进度,让客户端随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
  6. 程序运行结束后,客户端 SparkContext 向 RM 申请注销并关闭自身。

三、YARN-Client 模式启动类图

先大致画个 YARN-Clinet 运行模式应用程序启动类图:

四、YARN-Client 实现原理

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值