Giraph原始碼分析(四)—— Master 如何檢查Worker啟動
本文的目的
說明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來高效的進行檢測。設計理念如下:
- 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時,就停止。
總結:每建立一個子節點時,才會進行一次檢測,效率較高!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3244/viewspace-2823533/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Giraph原始碼分析(四)—— Master 如何檢查Worker啟動成功原始碼AST
- Giraph原始碼分析(二)—啟動Master/Worker服務原始碼AST
- Giraph原始碼分析(六)——Edge 分析原始碼
- Android 8.0 原始碼分析 (四) Activity 啟動Android原始碼
- Giraph原始碼分析(三)—— 訊息通訊原始碼
- Giraph原始碼分析(七)—— 新增訊息統計功能原始碼
- Giraph 原始碼分析(五)—— 載入資料+同步總結原始碼
- Master-Worker模式AST模式
- Master-Worker 模式AST模式
- Tomcat原始碼分析--啟動流程Tomcat原始碼
- Flutter啟動流程原始碼分析Flutter原始碼
- Activity啟動流程原始碼分析原始碼
- apiserver原始碼分析——啟動流程APIServer原始碼
- [原始碼解析] 並行分散式框架 Celery 之 worker 啟動 (2)原始碼並行分散式框架
- [原始碼解析] 並行分散式框架 Celery 之 worker 啟動 (1)原始碼並行分散式框架
- 比特幣原始碼分析:多執行緒檢查指令碼比特幣原始碼執行緒指令碼
- Android Activity啟動流程原始碼分析Android原始碼
- Spring啟動過程——原始碼分析Spring原始碼
- Android原始碼分析:Activity啟動流程Android原始碼
- Netty啟動流程及原始碼分析Netty原始碼
- ThinkPHP6.0 原始碼分析之啟動分析PHP原始碼
- dolphinscheduler master實現去中心化原始碼分析AST中心化原始碼
- preact原始碼分析(四)React原始碼
- 以太坊原始碼分析(39)geth啟動流程分析原始碼
- Netty NioEventLoop 啟動過程原始碼分析NettyOOP原始碼
- Spring Boot原始碼分析-啟動過程Spring Boot原始碼
- jetty啟動web專案原始碼分析JettyWeb原始碼
- Spring MVC 啟動過程原始碼分析SpringMVC原始碼
- containerd 原始碼分析:啟動註冊流程AI原始碼
- RocketMQ中PullConsumer的啟動原始碼分析MQ原始碼
- Android 8.0 原始碼分析 (六) BroadcastReceiver 啟動Android原始碼AST
- Android 8.0 原始碼分析 (五) Service 啟動Android原始碼
- RocketMQ中Producer的啟動原始碼分析MQ原始碼
- Apache Flink原始碼分析---JobManager啟動流程Apache原始碼
- Flutter app啟動flutter端原始碼分析FlutterAPP原始碼
- H5 worker 系列四 flv.js原始碼之logH5JS原始碼
- SpringBoot啟動程式碼和自動裝配原始碼分析Spring Boot原始碼
- Nginx實現原理master和workerNginxAST