史上最通俗易懂的Storm集羣架構分析,最大白話的Storm並行度理解

初識Strom:

一、原理架構圖

一個連續運行的主節點組織若干節點工作,構成了一個Storm集群。

在 Storm 集群中,有兩類節點:主節點(master node)和工作節點(worker nodes)。

  • 主節點運行著一個叫做 Nimbus 的守護進程,負責在集群中分發代碼,為工作節點分配任務,並監控狀態。Supervisor守護進程作為拓撲的一部分運行在工作節點上。
  • 每一個工作節點上面運行一個叫做Supervisor的節點。Supervisor會監聽分配給它那臺機器的工作,根據需要啟動/關閉工作進程。每一個工作進程執行一個topology的一個子集;一個運行的topology由運行在很多機器上的很多工作進程組成。
  • Nimbus和Supervisor之間的所有協調工作都是通過Zookeeper集群完成。另外,Nimbus進程和Supervisor進程都是快速失敗(fail-fast)和無狀態的。所有的狀態要麼在zookeeper裡面, 要麼在本地磁盤上。這也就意味著你可以用kill -9來殺死Nimbus和Supervisor進程, 然後再重啟它們,就好像什麼都沒有發生過。這個設計使得Storm異常的穩定。

相關概念的深度解讀:

  • Nimbus:負責資源分配和任務調度。
  • Supervisor:負責接受nimbus分配的任務,啟動和停止屬於自己管理的worker進程。
  • Worker:運行具體處理組件邏輯的進程。拓撲是在一個或多個工作進程(worker processes)中運行的,但一個worker只會運行一個topology,不會同時為多個topology服務。每個工作進程都是一個實際的 JVM 進程,並且執行拓撲的一個子集。Storm會在所有的worker 中分散任務,以便實現集群的負載均衡。worker只是一個JVM進程,並不是指1臺機器。1臺機器可以開啟多個worker進程。
  • Task:worker中每一個spout/bolt的線程稱為一個task. 在storm0.8之後,task不再與物理線程對應,同一個spout/bolt的task可能會共享一個物理線程,該線程稱為executor,即:一個executor只會同時運行一個task,即:一個spout/bolt實例,當有多個task的時候,會被輪詢調用的。簡而言之,就是一個task運行著一個spout/bolt實例。

最後,來張圖來展示它們的關係:

史上最通俗易懂的Storm集群架構分析,最大白話的Storm並行度理解

現在想象一下,很容易在整個 Storm 集群定義每個 bolt 和 spout 的並行性級別,因此你可以無限的擴展你的拓撲結構。通過增加Storm的並行度,可以大大提高程序運行的效率。

二、大白話理解Storm並行度:worker、executor和task之間的工作機制

1、引言

默認情況下,1個topology默認使用1個worker進程,每個worker進程默認啟動1個executor,每個executor默認啟動1個task。

註釋:一旦啟動了一個topology,worker是不能動態調整的,但是executor是可以動態調整的!!!

即:進程數固定,線程可以動態調整!!!

new一個Spout就是一個task;

new一個bolt又是一個task;

==>一個線程裡面就有了兩個task!!!

==>為了提高並行度:可以開多個worker,多個executor,而配置多個task(Spout或bolt)是沒有效果,只是為了增加邏輯性。

2、通過自定義配置改變Strom的並行度

我們先放一個官網的topology示例,通過該實例配置來一步步的介紹這個理解起來稍微有些複雜的概念:

Config conf = new Config();
conf.setNumWorkers(2); // 為此 topology 配置兩個 worker 進程

topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // blue-spout 並行度=2(2個executor)

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) // green-bolt 並行度=2
.setNumTasks(4) // 為此 green-bolt 配置 4 個 task
.shuffleGrouping("blue-spout");

topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6) // yellow-bolt 並行度=6
.shuffleGrouping("green-bolt");

StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);

我們先解讀一下上面配置的含義:

  • 該topology配置了2個worker進程,也就是同樣的工作會有2個進程來並行進行,可以肯定地說,2個worker肯定比1個worker執行效率要高很多,但是並沒有2倍的差距;
  • 默認情況下,1個supervisor節點最多可以啟動4個worker進程(因為默認配置裡面就最多隻分配了4個,當然你也可以改這個配置)
  • 配置了一個 blue-spout,並且為其指定了 2 個 executor,即並行度為2;
  • 配置了一個 green-bolt,並且為其指定了 2 個 executor,即並行度為2,並設置了4個task;
  • 配置了一個 yellow-bolt,並且為其指定了 6 個 executor,即並行度為6;

我們在給出官方的圖,看下官方的總結:

史上最通俗易懂的Storm集群架構分析,最大白話的Storm並行度理解

可以看出,這個圖片完整無缺地還原了代碼裡設定的 topology 結構:

  • 圖左最大的灰色方框,表示這個 topology;
  • topology 裡面剛好有兩個白色方框,表示2個 worker 進程;
  • 每個 worker 裡面的灰色方框表示 executor 線程,可以看到2個 worker 方框裡各有5個 executor;
  • 為什麼各有5個executor呢?
  • 因為代碼裡面指定的 spout 並行度=2,green-bolt並行度=2,yellow-bolt並行度=6,加起來剛好是10,而配置的 worker 數量為2,那麼自然地,這10個 executor 會均勻地分配到2個 worker 裡面;
  • 每個 executor 裡面的黃藍綠(寫著Task)的方框,就是最小的處理單元 task 了。
  • 我們重點看綠色的 Task 方框,與其他 Task 不同的是,兩個綠色方框同時出現在一個 executor 方框內。
  • 為什麼會這樣呢?
  • 大家回到上文看 topology 的定義代碼,topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4),這裡面的 setNumTasks(4) 表示為該 green-bolt 指定了4個 task,且 executor 的並行度為2,那麼自然地,這4個 task 會均勻地分配到2個 executor 裡面;
  • 圖右的三個圓圈,依次是藍色的 blue-spout,綠色的 green-bolt 和黃色的 yellow-bolt,並且用箭頭指示了三個組件之間的關係。spout 是數據的產生元件,而 green-bolt 則是數據的中間接收節點,yellow-bolt 則是數據的最後接收節點。這也是 DAG 的體現,有向的(箭頭不能往回走)無環圖。

根據上面的解釋,我們再通過一個圖進行總結:

史上最通俗易懂的Storm集群架構分析,最大白話的Storm並行度理解

希望,我已經講明白了,如果不明白,或者講的有什麼問題,歡迎留言……

下節我們將學習Storm的單機環境和分佈式環境的搭建、如何提交/查看/殺死Storm作業、Storm UI界面參數介紹,並實戰演示storm並行度參數調優以增強我們對Storm並行度的理解……


分享到:


相關文章: