分布式实时计算—Storm—基础介绍
目錄
一、概念
二、編程模型(spout->tuple->bolt)
三、Topology?運行
四、Storm Streaming Grouping
一、概念
Storm?是一個免費并開源的分布式實時計算系統。利用?Storm?可以很容易做到可靠地處理無限的 數據流,像?Hadoop?批量處理大數據一樣,Storm?可以實時處理數據。
1)Nimbus(master節點:代碼分發給?Supervisor)
Storm?集群的?Master?節點,負責分發用戶代碼,指派給具體的?Supervisor?節點上的?Worker?節點,去運行?Topology?對應的組件(Spout/Bolt)的?Task。
2)Supervisor(slave節點:管理?Worker?進程的啟動和終止)
Storm?集群的從節點,負責管理運行在?Supervisor?節點上的每一個?Worker?進程的啟動和終止。 通過?Storm?的配置文件中的?supervisor.slots.ports?配置項,可以指定在一個?Supervisor?上最大允許多少個?Slot,每個?Slot?通過端口號來唯一標識,一個端口號對應一個?Worker?進程(如果該?Worker?進程被啟動)。
3)Worker(具體處理組件邏輯的進程)?
運行具體處理組件邏輯的進程。Worker?運行的任務類型只有兩種,一種是?Spout?任務,一種是Bolt?任務。
4)Task
worker?中每一個?spout/bolt?的線程稱為一個?task.?在?storm0.8?之后,task?不再與物理線程對應, 不同?spout/bolt?的?task?可能會共享一個物理線程,該線程稱為?executor。
5)ZooKeeper
用來協調?Nimbus?和?Supervisor,如果?Supervisor?因故障出現問題而無法運行?Topology,?Nimbus?會第一時間感知到,并重新分配?Topology?到其它可用的?Supervisor?上運行
二、編程模型(spout->tuple->bolt)
strom?在運行中可分為?spout?與?bolt?兩個組件,其中,數據源從?spout?開始,數據以?tuple?的方式發送到?bolt,多個?bolt?可以串連起來,一個?bolt?也可以接入多個?spot/bolt.運行時原理如下圖:
1)Topology
Storm?中運行的一個實時應用程序的名稱。將?Spout、?Bolt?整合起來的拓撲圖。定義了?Spout?和?Bolt?的結合關系、并發數量、配置等等。
2)Spout
在一個?topology?中獲取源數據流的組件。通常情況下?spout?會從外部數據源中讀取數據,然后轉 換為?topology?內部的源數據。
3)Bolt
接受數據然后執行處理的組件,用戶可以在其中執行自己想要的操作。
4)Tuple
一次消息傳遞的基本單元,理解為一組消息就是一個?Tuple。
5)Stream
Tuple?的集合。表示數據的流向。
三、Topology?運行
在?Storm?中,一個實時應用的計算任務被打包作為?Topology?發布,這同?Hadoop MapReduce?任務相似。但是有一點不同的是:在?Hadoop?中,MapReduce?任務最終會執行完成后結束;而在?Storm?中,Topology?任務一旦提交后永遠不會結束,除非你顯示去停止任務。計算任務?Topology?是由不同的?Spouts?和?Bolts,通過數據流(Stream)連接起來圖。一個?Storm?在集群上運行一個?Topology?時,主要通過以下?3?個實體來完成?Topology?的執行工作:
(1)Worker(進程) ? (2)Executor(線程) ? (3)Task
1)Worker(1?個?worker?進程執行的是?1?個?topology?的子集)
1?個?worker?進程執行的是?1?個?topology?的子集(注:不會出現?1?個?worker?為多個?topology?服務)。1?個?worker?進程會啟動?1?個或多個?executor?線程來執行?1?個?topology?的?component(spout?或?bolt)。因此,1?個運行中的?topology?就是由集群中多臺物理機上的多個?worker?進程組成的。
2)Executor(executor?是?1?個被?worker?進程啟動的單獨線程)
executor?是?1?個被?worker?進程啟動的單獨線程。每個?executor?只會運行?1?個?topology?的?1?個?component(spout?或?bolt)的?task(注:task?可以是?1?個或多個,storm?默認是?1?個?component?只生成?1?個?task,executor?線程里會在每次循環里順序調用所有?task?實例)。
3)Task(最終運行?spout?或?bolt?中代碼的單元)
是最終運行?spout?或?bolt?中代碼的單元(注:1?個?task?即為?spout?或?bolt?的?1?個實例,?executor?線程在執行期間會調用該?task?的?nextTuple?或?execute?方法)。topology?啟動后,1?個?component(spout?或?bolt)的?task?數目是固定不變的,但該?component?使用的?executor?線 程數可以動態調整(例如:1?個?executor?線程可以執行該?component?的?1?個或多個?task?實 例)。這意味著,對于?1?個?component?存在這樣的條件:#threads<=#tasks(即:線程數小于 等于?task?數目)。默認情況下?task?的數目等于?executor?線程數目,即?1?個?executor?線程只運 行?1?個?task。
四、Storm Streaming Grouping
Storm?中最重要的抽象,應該就是?Stream grouping?了,它能夠控制?Spot/Bolt?對應的?Task?以什么樣的方式來分發?Tuple,將?Tuple?發射到目的?Spot/Bolt?對應的?Task.??
目前,Storm Streaming Grouping?支持如下幾種類型:
1)huffle Grouping
隨機分組,盡量均勻分布到下游?Bolt?中將流分組定義為混排。這種混排分組意味著來自?Spout?的 輸入將混排,或隨機分發給此?Bolt?中的任務。shuffle grouping?對各個?task?的?tuple?分配的比 較均勻。
2)Fields Grouping
按字段分組,按數據中?field?值進行分組;相同?field?值的?Tuple?被發送到相同的?Task?這種?grouping?機制保證相同?field?值的?tuple?會去同一個?task。
3)All grouping?:廣播
?廣播發送, 對于每一個 tuple 將會復制到每一個 bolt 中處理。
4)Global grouping
全局分組,Tuple?被分配到一個?Bolt?中的一個?Task,實現事務性的?Topology。Stream?中的所 有的?tuple?都會發送給同一個?bolt?任務處理,所有的?tuple?將會發送給擁有最小?task_id?的?bolt?任務處理。
5)None grouping?:不分組
不關注并行處理負載均衡策略時使用該方式,目前等同于?shuffle grouping,另外?storm?將會把?bolt?任務和他的上游提供數據的任務安排在同一個線程下。
6)Direct grouping?:直接分組 指定分組
由?tuple?的發射單元直接決定?tuple?將發射給那個?bolt,一般情況下是由接收?tuple?的?bolt?決定 接收哪個?bolt?發射的?Tuple。這是一種比較特別的分組方法,用這種分組意味著消息的發送者指 定由消息接收者的哪個?task?處理這個消息。 只有被聲明為?Direct Stream?的消息流可以聲明這種 分組方法。而且這種消息?tuple?必須使用?emitDirect?方法來發射。消息處理者可以通過?TopologyContext?來獲取處理它的消息的?taskid (OutputCollector.emit?方法也會返回?taskid)。
總結
以上是生活随笔為你收集整理的分布式实时计算—Storm—基础介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式资源调度—YARN框架
- 下一篇: 云计算—基础介绍