Giraph源码分析(四)—— Master 如何检查Worker启动成功

简介: 本文的目的说明Giraph如何借助ZooKeeper来实现Master与Workers间的同步(不太确定)。环境在单机上(机器名:giraphx)启动了2个workers。Giraph遵从单Master多Workers结构,BSPServiceMaster使用MasterThread线程来进行全局的同步。

本文的目的

说明Giraph如何借助ZooKeeper来实现Master与Workers间的同步(不太确定)。

环境

在单机上(机器名:giraphx)启动了2个workers。

Giraph遵从单Master多Workers结构,BSPServiceMaster使用MasterThread线程来进行全局的同步。每个Worker启动成功后,会向Master汇报自身的健康状况,那么Master是如何检测Workers是否都成功启动了?

Master在ZooKeeper上创两个目录,_workerHealthyDir和 _workerUnhealthyDir,分别用来记录Healthy Workers和UnHealthy Workers。

主要在BspServiceMaster类中的getAllWorkerInfos()方法来完成,其调用关系如下,注意下getAllWorkerInfos()到MasterThread.run()方法调用关系,比较难找。

创建的两个目录如下:

/_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/0/_superstepDir/-1/_workerHealthyDir /_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/0/_superstepDir/-1/_workerUnhealthyDir

每个Worker在setup()中,调用registerHealth()方法来注册自身的状态。

若自身是Healthy的,则在_workerHealthyDir目录下添加子节点 /wokerInfo.getHostNameId(),否则在_workerUnhealthyDir目录下添加。wokerInfo.getHostNameId()为:Hostname+“_”+TaskId。 Task1和Task2 (Task 0是master) 创建的子节点如下:

/_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/0/_superstepDir/-1/_workerHealthyDir/giraphx_1
/_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/0/_superstepDir/-1/_workerHealthyDir/giraphx_2

Master 在checkWorkers()方法中,在While死循环中(实际有超时限制),通过调用getAllWorkerInfos()方法来获取_workerHealthyDir目录下的子节点,然后比较子节点数目是否达到maxWorkers(启动job时定义的,-w参数)。

若小于maxWorkers,则继续调用getAllWorkerInfos()方法进行下一轮检测;若等于maxWorker,退出While循环,然后返回healthyWorkersInfoList:[Worker(hostname=giraphx, MRtaskID=1, port=30001), Worker(hostname=giraphx, MRtaskID=2, port=30002)] 。

问题:由于在分布式环境中,每个Worker和Maste都是并行运行,彼此不知道对方的运行情况。上述第3步骤中,若还有子节点还没有创建,就一直在while死循环中调用来检测getAllWorkerInfos()方法检测,效率比较低下,当然也比较笨!

Giraph借用ZooKeeper来高效的进行检测。设计理念如下:

  1. master在获取子节点时,注册Watcher(为注册器,用于触发相应事件)。

若某个task创建了子节点后,就会触发Watcher事件。

若子节点数目小于maxWorkers,就调用 workerHealthRegistrationChanged的await()方法释放当前线程的锁,陷入等待状态。不会进行无用的检测。

说明:workerHealthRegistrationChanged为PredicateLock类型(implements BspEvent接口),PredicateLock里面使用可重入锁 ReentrantLock和Condition进行线程的控制。

当某个task创建了子节点后,触发Watcher事件。

调用BspService中的public final void Process(WatchedEvent event)事件,该方法根据事件的路径来激活相应的BspEvent事件。此处对应的是:

实验运行如下:

s(926)) - process: Got a new event, path = /_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/0/_superstepDir/-1/_workerHealthyDir, type = NodeChildrenChanged, state = SyncConnected INFO bsp.BspService (BspService.java:process(960)) - process: workerHealthRegistrationChanged (worker health reported - healthy/unhealthy )

这样就会激活master线程,开始下一轮检测。

子节点数目等于maxWorkers时,就停止。

总结:每创建一个子节点时,才会进行一次检测,效率较高!

相关文章
|
Linux
mount 挂载 iso 镜像文件
【1月更文挑战第3天】
1624 0
|
Go Android开发
autojs发送通知修改图标
牙叔教程 简单易懂
806 0
|
5月前
|
人工智能 自然语言处理 运维
销售易与纷享销客产品力对比:谁更胜一筹?
本文对比分析了销售易与纷享销客两大国产CRM厂商,从产品核心竞争力、服务中大型企业能力、AI技术应用三大维度展开。纷享销客在连接型CRM架构、PaaS平台灵活性、国际化支持等方面优势明显,其行业化解决方案覆盖更广,实施资源更充足。同时,其ShareAI平台深度结合行业场景,提供更强的智能化支持。尽管定价略高,但全生命周期价值显著,是中大型企业实现数字化转型的优选伙伴。
|
6月前
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
350 13
|
11月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
217 12
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
《C++ 赋能神经网络:深入解析前向传播与反向传播算法》
本文深入探讨了如何用C++实现神经网络的前向传播和反向传播算法。首先介绍了神经网络的基础概念,包括其结构和工作原理;接着详细解析了前向传播的数据流动过程和反向传播的误差修正机制。文章还讨论了C++实现神经网络的优势与挑战,并展望了其在计算机视觉和自然语言处理等领域的广泛应用前景。
267 40
|
达摩院 算法 安全
智慧楼宇多目标调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了使用MindOpt工具优化智慧楼宇的多目标调度问题,特别是在虚拟电厂场景下的应用。智慧楼宇通过智能化技术综合考虑能耗、舒适度等多目标,实现楼宇设备的有效管理和调度。虚拟电厂作为多能源聚合体,能够参与电力市场,提供调峰、调频等辅助服务。文章介绍了如何使用MindOpt云上建模求解平台及MindOpt APL建模语言对楼宇多目标调度问题进行数学建模和求解,旨在通过优化储能设备的充放电操作来最小化用电成本、碳排放成本和功率变化成本,从而实现经济、环保和电网稳定的综合目标。最终结果显示,在使用储能设备的情况下,相比不使用储能设备的情形,成本节约达到了约48%。
|
9月前
|
机器学习/深度学习 人工智能 运维
智能化运维在现代IT系统中的应用与挑战####
本文探讨了智能化运维(AIOps)在现代IT系统中的关键作用及其面临的主要挑战。随着云计算、大数据和人工智能技术的飞速发展,传统的IT运维模式正逐渐向更加智能、自动化的方向转变。智能化运维通过集成机器学习算法、数据分析工具和自动化流程,显著提升了系统稳定性、故障响应速度和资源利用效率。然而,这一转型过程中也伴随着数据隐私、技术复杂性和人才短缺等问题。本文旨在为读者提供一个关于智能化运维的全面视角,分析其优势与挑战,并探讨未来的发展趋势。 ####
155 6
|
人工智能
AI绘画,Stable Diffusion如何使用中文简体包,黑色页面切换参数http://127.0.0.1:7860/?__theme=dark 两个__,中文包下载和安装
AI绘画,Stable Diffusion如何使用中文简体包,黑色页面切换参数http://127.0.0.1:7860/?__theme=dark 两个__,中文包下载和安装
|
存储 消息中间件 Kubernetes
在K8S中,deploy和Statefulset有何区别?
在K8S中,deploy和Statefulset有何区别?

热门文章

最新文章