山东大学软件工程应用与实践: Spark(十二) 代码分析

本文主要探讨了Spark中的ExecutorAllocationManager的创建与启动,讲解了如何动态管理Executor,以及ContextCleaner的工作原理,用于清理RDD、ShuffleDependency和Broadcast对象。此外,还介绍了Spark环境更新的过程,包括SparkContext初始化时如何处理jar包和文件,并影响环境设置。
摘要由CSDN通过智能技术生成

2021SC@SDUSC


目录

创建和启动ExecutorAllocationManager

ContextCleaner的创建和启动

Spark环境更新


创建和启动ExecutorAllocationManager

ExecutorAllocationManager用于对已分配的Executor进行管理,创建和启动ExecutorAllocationManager的代码如下:

private[spark] val executorAllocationManager: Option[ExecutorAllocationManager] = 
    if (conf.getBoolean("spark.dynamicAllocation.enabled", false)) {
        Some ( new ExecutorAllocationManager(this, listenerBus, conf))
    } else {
        None
    }
executorAllocationManager.foreach(_.start())

默认情况下不会创建ExecutorAllocationManager,可以修改属性spark.dynamicAllocation.enabled为true来创建。ExecutorAllocationManager可以设置动态分配最小Executor数量、动态分配最大Executor数量、每个Executor可以运行的Task数量等配置信息,并对配置信息进行校验。start方法将ExecutorAllocationListener加入listenerBus中,ExecutorAllocationListener通过监听listenerBus里的事件、动态添加、删除Executor。并且通过Thread不断添加Executor,遍历Executor,将超过的Executor杀掉并移除。ExecutorAllocationManager的实现与其他SparkListener类似,不再赘述。ExecutorAllocationManager的关键代码如下(3-47):

// code 3-47
private val intervalMillis: Long = 100
private var clock: Clock = new RealClock
private val listener = new ExecutorAllocationListener
def start(): Unit = {
    listenerBus.addListener(listener)
    startPolling()
}

private def startPolling(): Unit = {
    val t = new Thread {
        override def run(): Unit = {
            while (true) {
                try {
                    scheduel()
                } catch {
                    case e: Exception => logError("Exception in dynamic executor allocation         
                        thread!", e)
                }
                Thread.sleep(intervalMillis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值