【轉】storm和zookeeper中的節點的關係

  • 2019 年 10 月 4 日
  • 筆記

【轉】https://www.cnblogs.com/yuananyun/p/5186427.html

一、Nimbus

Nimbus既需要在Zookeeper中創建元數據,也需要從Zookeeper中獲取元數據。

如上圖箭頭1所示:

1、對於路徑a,Nimbus只會創建路徑,不會設置數據,數據是稍後由Worker設置的。

2、對於路基b和c,Nimbus在創建她們的時候就會設置數據。

3、路徑a和b只有在提交新的Topology時才會創建,且b中的數據設置好以後就不會再變化;c在第一次為該Topology進行任務分配的時候會創建,若任務分配計劃有變,Nimbus會更新它內容。

如上圖箭頭2所示:

1、Nimbus需要從路徑a讀取當前已經被分配的Worker的運行狀態。根據該資訊,Nimbus可以得知哪些Worker狀態正常,哪些需要被重新調度。同時還會獲取到該Worker上所有的Executor資訊,這些資訊會通過UI呈現給用戶。

2、從路徑b可以獲取當前集群中所有Supervisor狀態,通過這些資訊可以得知哪些Supervisor上還有空閑資源可用,哪些Supervisor不再活躍,需要將已經分配到它的任務分配到其他節點上。

3、從路徑c上可以獲取當前所有的錯誤資訊並通過UI展現給用戶。

二、Supervisor

Supervisor也需要通過Zookeepr來創建和獲取元數據。除此之外,Supervisor還通過監控指定的本地文件來監測由它啟動的所有的Worker的運行狀態。

1、箭頭3表示Supervisor在Zookeeper中創建的路徑是/storm/supervisor/<supervisor-id>。新節點加入時會在該路徑下創建一個znode節點。值得注意的是,該節點是一個臨時節點,一旦Supervisor與Zookeepr的連接超時或斷開,該節點會被自動刪除。該目錄下的znode節點列表代表了目前活躍的Supervisor,這保證了Nimbus能夠及時得知當前集群中機器的狀態,這是Nimbus可以進行任務分配的基礎,也是Storm具有容錯性以及擴展性的基礎。

2、箭頭4表示Supervisor需要獲取數據的路徑是/storm/assignments/<topology-id>。這個路徑是Nimbus寫入的對Topology的任務分配資訊,Supervisor從該路徑可以獲取到Nimbus分配給它的所有任務。Supervisor在本地保存了上次的分配資訊,對比這兩部分的資訊可以得知分配資訊是否有變化。若發生變化,則需要進行任務的移除和啟動。

3、箭頭9表示Supervisor會從LocalState中獲取由它啟動的所有Worker的心跳資訊。Supervisor每隔一段時間檢查一次這些心跳資訊,如果發現某個Worker在這段時間內沒有更新心跳資訊,表明該Worker當前的運行狀態出了問題。這時Supervisor會殺死這個Worker(Worker本質是一個進程),原本分配給這個Worker的任務就會被重新分配。

三、Worker

Worker也需要利用Zookeeper來創建和獲取元數據,同時它還需要利用本地的文件來記錄自己的心跳資訊。

1、箭頭5表示Worker在Zookeeper中創建的路徑是/storm/workerbeats/<topology-id>/node-port。在Worker啟動時,將創建一個與其對應的znode節點,相當於對自身進行註冊。需要注意的是,Nimbus在Topology被提交時只會創建路徑/storm/workerbeats/<topology-id>,而不會設置數據,數據則等Worker啟動之後由Worker創建。這樣安排的目的之一是為了避免多個Worker同時創建路徑時導致衝突。

2、箭頭6表示Worker需要獲取/storm/assignments/<topology-id>路徑的數據,這裡包含分配給它的任務資訊。

3、箭頭8表示Worker在LocalState中保存心跳資訊。LocalState實際上將這些資訊保存在本地文件中,Worker用這些資訊與Supervisor保持心跳,每隔幾秒鐘需要更新一次心跳資訊。因為Worker與Supervisor屬於不同的進程,因此Storm採用本地文件的方式來傳遞心跳。

四、Executor

Executor只會利用Zookeeper來記錄自己的運行錯誤資訊。箭頭7表示Executor在Zookeeper中創建的路徑,每個Executor會在運行過程中記錄發生的錯誤。

五、心跳維持

由上可知,Nimbus、Supervisor和Worker兩兩之間都要維持心跳資訊,它們的心跳資訊如下:

1、Nimbus和Supervisor之間通過/storm/supervisor/<supervisor-id>路徑對應的數據進行心跳保持。該節點是臨時節點,只要Supervisor死掉,對應路徑的數據就會被刪掉,Nimbus就會將原本分配給改Supervisor的任務重新分配。

2、Worker和Nimbus之間通過/storm/workerbeats/<topology-id>/node-port路徑中的數據進行心跳維持。Nimbus會每隔一段時間獲取該路徑下的數據,同時Nimbus還會在它的記憶體中保存上一次的資訊。如果發現某個Worker的心跳資訊有一段時間沒有更新,就認為該worker已經死掉了,Nimbus會對任務進行重新分配,將分配到該Worker的任務分配給其他的Worker。

3、Worker與Supervisor之間通過本地文件(LocalState)進行心跳保持。

僅此而已