在SchedulerBackend的实现类中只有CoarseGrainedSchedulerBackend同时实现了特质ExecutorAllocationClient
removeExecutors方法将利用ExecutorAllocationClient的killExecutors方法通知集群管理器“杀死”Executor。
killExecutors方法需要ExecutorAllocationClient的实现类去实现
updateAndSyncNumExecutorTarget方法的实现如下:
代码
ExecutorAllocationManager还在初始化则返回0
减少需要的Executor数量
添加Executor
可以用图表示Executor的动态分配过程
ContextCleaner的启动用于清理那些超出应用范围的RDD、Shuffle对应的map任务状态、Shuffle元数据、Broadcast对象及RDD的Checkpoint数据
创建ContextCleaner代码
可以通过spark.cleaner.referenceTracking来决定是否启用ContextCleaner
ContextCleaner的代码如下
代码
缓存顶级的AnyRef引用
缓存AnyRef的虚引用
监听器数组
工作线程,该线程为守护线程
用于执行GC的单线程线程池
清理非shuffle时是否阻塞
清理shuffle数据是否阻塞
启动ContextCleaner的代码如下
代码
设置为守护线程
设置名称
启动线程
启动定期执行GC的线程池
cleaningThread该线程实际上就是执行keepCleaning方法
代码
可以看到该方法匹配各种引用,并执行相应方法进行清理,以doCleanupRDD为例
调用unpersistRDD方法,从内存或者磁盘移除RDD
从persistRDDs中移除对该RDD的跟踪
调用所有监听器的rddCleaned方法



