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)
...