Storm上的Nimbus、Supervisor以及Worker之間的關係
1.Storm中各節點介紹
1.1 主控節點和工作節點
Storm將每個節點分為主控節點和工作節點兩種,其中主控節點只有一個,工作節點可以有多個。
1.2 Nimbus
主控節點執行Nimbus守護程序,類似於Hadoop中的jobtracker,負責在叢集中分發程式碼,對節點分配任務,並監視主機故障。
1.3 Supervisor
每個工作節點執行Supervisor守護程序,負責監聽工作節點上已經分配的主機作業,啟動和停止Nimbus已經分配的工作程序。
supervisor會定時從zookeeper獲取拓補資訊topologies、任務分配資訊assignments及各類心跳資訊,以此為依據進行任務分配。
在supervisor同步時,會根據新的任務分配情況來啟動新的worker或者關閉舊的worker並進行負載均衡。
1.4 Worker
Worker是具體處理Spout/Bolt邏輯的程序,根據提交的拓撲中conf.setNumWorkers(3);定義分配每個拓撲對應的worker數量,Storm會在每個Worker上均勻分配任務,一個Worker只能執行一個topology,但是可以執行其中的多個任務執行緒。
1.5 任務(Task)
任務是指Worker中每個Spout/Bolt執行緒,每個Spout和Bolt在叢集中會執行許多工,每個任務對應一個執行緒執行,可以通過TopologyBuilder類的setSpout()和setBolt()方法來設定每個Spout或者Bolt的並行度。
1.6 參考資料
2.Storm的容錯機制
2.1 Worker程序死亡
當僅有Worker程序死亡時,其主機上的Supervisor會嘗試重啟Worker程序,如果連續重啟都失敗,當超過一定的失敗次數之後,Nimbus會在其他主機上重啟Worker。
當Supervisor死亡時,如果某個主機上的Worker死亡了,由於沒有Supervisor,所以無法在本機重啟Worker,但會在其他主機上重啟Worker,當Supervisor重啟以後,會將本機的Worker重啟,而之間在其他主機上重啟的Worker則會消失,例如之前node2有三個Worker,node3有三個Worker,當node2的Supervisor死亡並且kill掉一個Worker之後,node3出現四個Worker,重啟node2的Supervisor之後,node2會重啟一個Worker,恢復成三個Worker,node3kill掉多餘的一個Worker,也恢復成三個Worker。
當Nimbus死亡時,Worker也會繼續執行,但是某個Worker死亡時不會像Supervisor死亡時安排到其他主機上執行,因此如果Worker全部死亡,則任務執行失敗。
叢集中的Worker是均勻分配到各節點上的,例如一個作業有三個Worker時,會在一個節點(例如node2)分配兩個Worker,在一個節點(例如node3)分配一個Worker,當再啟動一個需要三個Worker的作業時,會在node2分配一個Worker,在node3分配兩個Worker。
2.2 Nimbus或者Supervisor程序死亡
Nimbus和Supervisor被設計成是快速失敗且無狀態的,他們的狀態都儲存在ZooKeeper或者磁碟上,如果這兩個程序死亡,它們不會像Worker一樣自動重啟,但是叢集上的作業仍然可以在Worker中執行,並且他們重啟之後會像什麼都沒發生一樣正常工作。
2.3 ZooKeeper停止
ZooKeeper的停止同樣不會影響已有的作業執行,此時kill掉Worker以後過段時間仍會在本機重啟一個Worker。
綜上所述,只有Nimbus失敗並且所有Worker都失敗之後才會影響叢集上的作業執行,除此之外Storm叢集的容錯機制可以保證作業執行的可靠性。