Master深度剖析

来源:互联网 发布:历史的巧合 知乎 编辑:程序博客网 时间:2024/06/09 18:50

一. Master注册机制
driver启动后,执行application代码,sparkcontext初始化时,底层的sparkdeployschedulerbackend,通过appclient的内部现场clientactor发送registerapplication到Master注册application
将application,driver,最新的可用的worker信息分别加入相应缓存(HashMap),加入相应的队列,进行持久化,然后调用schedule()方法进行资源调度,work启动后反向注册。
入口:org.apache.Spark.deploy.master文件下的receiveWithLogging方法中的case RegisterApplication(注册Application)、case RegisterWorker(注册Worker)、case RequestSubmitDriver(注册Driver).

二. Master状态改变机制(再看一遍)
driver状态改变
若状态为ERROR,FINISHED,FAILED时调用 removeDriver方法移除Driver。
removeDriver步骤如下:
根据driverId找到driver
清除内存中的driver
将driver加入completedDrivers
去掉该driver的持久化信息
设置driver的状态信息
在driver所在的worker中移除driver
调用schedule()对资源重新调度

Executor状态改变
通过appId找到applicationInfo,再根据execId从applicationInfo中获取ExecutorDesc信息
设置ExecutorDesc的当前状态
向ExecutorDesc对应的driver发送ExecutorUpdated信息
如果executor已经执行完毕,先从appInfo中移除Executor,再从executorDesc的worker中移除executorDesc信息
如果executor为非正常退出,且还未到达重试调度上线,将重试调度直到成功或者达到上限,否则将移除改Application并将状态设置为FAILED
入口:org.apache.spark.deploy.master文件下的receiveWithLogging方法中的DriverStateChanged(Driver状态改变处理)、ExecutorStateChanged(Executor状态改变处理)。

三. master资源调度算法
scheduler()方法,每次有新的应用提交或者集群 资源状况发生变化时(executor增加)调用scheduler()
master状态为ALIVE才进行资源调度,如果不是ALIVE会直接返回。
首先会使用Random.shuffle将master保留的worker信息随机打乱,以实现负载均衡。将worker存入ArrayBuffer,n从最后一个元素到索引为3,k为0到n-1的随机数,交换n和k中存的worker信息,执行结束时,worker顺序被完全打乱了。
spark默认启动executor的方式是FIFO,也就是说每个提交的应用程序都放在调度的等待队列中,先进先出。