Spark源码精读 之 ApplicationMaster

1、背景介绍

Spark版本:V2.3.2

2、关键代码

Spark任务提交后,若是集群模式,会将org.apache.spark.deploy.yarn.ApplicationMaster类的main函数作为主入口,并启动进程来运行此类。

def main(args: Array[String]): Unit = {
  master = new ApplicationMaster(amArgs)
  System.exit(master.run())
}

我们看下ApplicationMaster函数实例化的时候,有哪些值得关注的信息。

ApplicationMaster
private val client = doAsUser { new YarnRMClient() }

YarnRMClient
private var amClient: AMRMClient[ContainerRequest] = _

client就是YarnRMClient函数实例化的对象。
amClient,是AMRMClientImpl函数实例化的对象,后续注册Driver注册AM,就是这个对象去实现的。
接下来是master.run()方法,这里有两条线,一条线是执行–class指向的函数,也就是咱们的Spark代码,另一条线就是向RM注册并分配Containers。

// 第一条线
userClassThread = startUserApplication()

// 第二条线
val totalWaitTime = sparkConf.get(AM_MAX_WAIT_TIME)
try {
  val sc = ThreadUtils.awaitResult(sparkContextPromise.future,
    Duration(totalWaitTime, TimeUnit.MILLISECONDS))
  if (sc != null) {
    rpcEnv = sc.env.rpcEnv
    val driverRef = createSchedulerRef(
      sc.getConf.get("spark.driver.host"),
      sc.getConf.get("spark.driver.port"))
    registerAM(sc.getConf, rpcEnv, driverRef, sc.ui.map(_.webUrl))
    registered = true
  } 
  userClassThread.join()

在注册AM的同时, 会初始化amClient并由amClient对象完成向RM注册,并返回类型为YarnAllocator的allocator对象。
然后再初始化AM endpoint。
最后由allocator分配资源。

ApplicationMaster
allocator = client.register(driverUrl,
  driverRef,
  yarnConf,
  _sparkConf,
  uiAddress,
  historyAddress,
  securityMgr,
  localResources)
  
YarnRMClient
amClient = AMRMClient.createAMRMClient()
 
ApplicationMaster
rpcEnv.setupEndpoint("YarnAM", new AMEndpoint(rpcEnv, driverRef))
allocator.allocateResources()

至此,ApplicationMaster进程资源这一条线完成所有动作,等到另一条线程执行完–class的函数后,完成整个Spark任务。
简单画条流程图,后补详细的。

3、简单流程图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值