spark-Master注册机制 和 状态改变处理机制
查看源码需要先进行编译,注意修改版本:
./make-distribution.sh --tgz -Phadoop-2.6 -Pyarn -DskipTests -Dhadoop.version=2.6.0 -Phive
一:worker注册机制(worker启动之后)
1- worker在启动之后,就会主动向master进行注册;
2- Master将dead状态的worker过滤掉;将unknown状态的worker信息更新;
3- Master将worker将入到内存缓存中(HashMap);
4- 持久化引擎将worker信息进行持久化(zookeeper和文件系统中);
5- 调用scheduler()方法,进行资源调度;
源代码见:Master.scala的RegisterWorker()方法。
二:Driver注册(在spark-submit的时候进行注册);
1- 将diver信息放到内存缓存中(HashMap);
2- 加入等待调度队列(ArrayBuffer);
3- 持久化引擎将driver信息进行持久化;
4- 调用scheduler()方法,进行资源调度;
源码见:Master.scala的ReceiverAndReply()方法进行监控;
Client.scala的RegisterSubmitDriver()方法进行注册;
三: Application注册(执行sparkContext的时候,底层会触发其调度)
1- 将application信息放到缓存中(HashMap);
2- 将application加入到等待调度的application队列中;
3- 持久化引擎将application信息进行持久化;
4- 调用scheduler()方法,进行资源调度;
源代码见:Master.scala的RegisterApplication()方法:
case RegisterApplication(description, driver) => // TODO Prevent repeated registrations from some driver //如果是standby状态,则不是active的master,不执行任何操作 if (state == RecoveryState.STANDBY) { // ignore, don't send response //否则,执行以下行为 } else { logInfo("Registering app " + description.name) //创建app信息类 val app = createApplication(description, driver) //注册application,将application信息放到缓存中,并且加入到等待调度的队列中 registerApplication(app) logInfo("Registered app " + description.name + " with ID " + app.id) //使用持久化殷勤,将application进行持久化 persistenceEngine.addApplication(app) //反向向sparkDeploySchedulerBackend的appClient的ClientActor发送消息,也就是RegisteredApplication driver.send(RegisteredApplication(app.id, self)) //执行scheduler,进行资源调度 schedule() }
扩展:spark从入门到精通,中华石杉,第46讲;
四: driver状态改变
1- 判断driver的状态;
2- 将driver从内存中(hashMap)移除; 将持久化信息进行移除; 移除该driver相关的worker信息; 调用scheduler方法;
源码见Master.scala的DriverStateChanged()方法。
五:Excetor状态改变
1- 找到状态改变的Excetor;
2- 向driver发送excutorUpdated消息;
3- 如果Excetor执行完毕,将worker信息进行移除;
如果没有执行完毕,则进行重试功能,默认次数是10次;
如果超过10次,将application信息进行移除操作;
源码见:Master.scala的ExcutorChanged方法。
拓展阅读见:中华石杉-spark从入门到精通第47讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!