Spark Yarn资源调度流程简析

一、Yarn Cluster模式

简单说下Spark Yarn cluster模式的资源调度过程。

这种模式用到YarnClusterScheduler和YarnClusterScheduleBackend。前者没啥特别的和一般的任务调度器类似,主要继承TaskSchedulerImpl类。

后者是异步消息处理的,主要是申请资源类消息。SparkYarn里还实现了一个ApplicationMaster和Yarn交互,为简化后文用AM代替Spark Yarn的ApplicationMaster。AM中具体申请Yarn资源使用了YarnAllocator类。

AM先启动用户进程Driver,然后启动AM的Endpoint,将AM的Endpoint发送RegisterClusterManager消息给Driver进行注册(好让Driver知道到哪找AM)。等待Driver中的YarnClusterScheduleBackend转发资源申请请求消息。

申请资源时,spark发送RequestExecutors给YarnClusterScheduler,后者通过YarnClusterScheduleBackend来处理,YarnClusterScheduleBackend又转发给AM来处理这个消息,AM又调用YarnAllocator的方法来申请Yarn资源。

YarnAllocator申请好Container之后,在Container上启动YarnCoarseGrainedExecutorBackend(CoarseGrainedExecutorBackend的子类,两者的差别主要是设置Yarn的日志路径等),然后这个Container就可以和Driver交互了。

在Yarn Cluster模式下,spark-submit开始真正执行的第一个程序不是--class指定的用户进程,而是YarnClusterApplication,sparkSubmit做了处理,这点需要留意。

YarnClusterApplication在Spark-Yarn的Client.scala中定义,其实只是Client的一层包装:

private[spark] class YarnClusterApplication extends SparkApplication {

  override def start(args: Array[String], conf: SparkConf): Unit = {
    // SparkSubmit would use yarn cache to distribute files & jars in yarn mode,
    // so remove them from sparkConf here for yarn mode.
    conf.remove(JARS)
    conf.remove(FILES)

    new Client(new ClientArguments(args), conf, null).run()
  }

}

总结:

1、Spark-submit上传到Yarn集群jar包,提交Spark Yarn的ApplicationMaster。

2、ApplicationMaster启动Driver,Driver里启动YarnClusterScheduleBackend。同时ApplicationMaster启动AMEndpoint,AMEndpoint启动时首先发送RegisterClusterManager消息给Driver,好让Driver找到自己。

3、Driver申请资源,消息转发到AMEndpoint,AMEndpoint调用YarnAllocator类的方法进行Yarn资源申请。

4、资源申请成功后,YarnAllocator在申请的Container上启动YarnCoarseGrainedExecutorBackend,来和Driver上的YarnClusterScheduleBackend进行交互。

5、Spark On Yarn运行过程中stdout/stderr会重定向到Yarn的日志文件路径中。

理解了Yarn、Spark Yarn Cluster的资源调度过程,对于分布式计算就通了一半了。

二、Yarn Client模式

Client模式和Cluster的最大区别就是Driver是在客户端运行,而不是在Yarn集群运行。其他的AM向Driver注册这些过程还是一致的。

Client是在YarnClientSchedulerBackend中创建并启动的,Client的功能是向Yarn注册一个AM。

这里不细说了。

三、资源调度和Driver-Executor的关系

Spark不管是standalone还是Yarn方式,其Driver-Executor的模式都是一样的,Driver启动后等待Executor注册,然后Driver分配任务到Executor执行,这一套东西是同一个,不同的是资源调度的方式。

standalone方式下,每个节点启动Worker,Worker向Master注册,Driver申请资源是向Master申请,申请的资源在Worker上启动CoarseGrainedExecutorBackend,然后CoarseGrainedExecutorBackend再注册到Driver上的SchedulerBackend上。

Yarn方式下,Driver在Cluster模式下先通过YarnClusterApplication提交到Yarn,在Yarn上会启动AM和Driver,然后Driver通过AM向Yarn申请资源,申请的资源会在Yarn集群上启动Container,这个Container是直接启动CoarseGrainedExecutorBackend来向Driver注册,后面的过程就和standalone下一样的了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章