Spark 源码系列 - Yarn集群处理

环境调试

引入依赖

上篇文章提到SpartSubmit最终调用YarnClusterApplication对象的start方法, YarnClusterApplication代码存在于依赖包 spark-yarn 中,本文代码需要引入如下pom. 调试代码和生产代码不需要此依赖包

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-yarn_2.12</artifactId>
            <version>3.2.1</version>
        </dependency>

触发代码显示

默认下在Idea中使用ctrl + shift + F 无法找到该类,猜测是引入依赖,索引没有更新导致。在代码中写入val c = new YarnClusterApplication();, "ctrl + 鼠标" 点击YarnClusterApplication类,在跳转的页面点击"download source", 最后源代码引入成功。

Client

  • Client的全类名 org.apache.spark.deploy.yarn.Client
  • YarnClusterApplication 是 Client的内部类, 首先阅读该类是因为SparkSumit调用的是YarnClusterApplication的start方法。

YarnClusterApplication

Client 的内部类 YarnClusterApplication

private[spark] class YarnClusterApplication extends SparkApplication {
  override def start(args: Array[String], conf: SparkConf): Unit = {
    ...
    // new Client 通过 YarnClient.createYarnClient 创建 YarnClientImpl
    new Client(new ClientArguments(args), conf, null).run()
  }
}

YarnClientImpl

YarnClientImpl extends YarnClient extends AbstractService

Client 初始化核心

org.apache.spark.deploy.yarn.client

private[spark] class Client(...) {
  // new YarnClientImpl()
  private val yarnClient = YarnClient.createYarnClient
  ...
}

Client -> run

  def run(): Unit = {
    this.appId = submitApplication()
    ...
  }

Client -> submitApplication

  // yarnClient的类型是YarnClientImpl,调用的方法先在YarnClientImpl类中查找实现,没有再去YarnClient找,最后在AbstractService中找。
  def submitApplication(): ApplicationId = {
    ...
    try {
      // 网络连接,LauncherBackend中通过Socket建立连接
      launcherBackend.connect()
      // 处理配置信息,通知监听服务等
      yarnClient.init(hadoopConf)
      // 底层调用YarnClientImpl->serviceStart方法,
      // 1. 创建ApplicationClientProtocol(代理)对象, 用于Client向RM
      //   1.1 提交、终止job
      //   1.2 查询集群,节点,队列等信息。
      // 2. 启动historyClient, 对象类型是AHSClient(应用历史服务)
      yarnClient.start()
      ...
      // 提交应用
      yarnClient.submitApplication(appContext)
      ...
posted @ 2022-05-04 12:08  608088  阅读(122)  评论(0编辑  收藏  举报