Storm
DAG
有向無環圖Directed Acyclic Graph(DAG)
- 它由有限個頂點和有向邊組成,每條有向邊都從一個頂點指向另一個頂點;
- 從任意一個頂點出發都不能通過這些有向邊回到原來的頂點,
- 有向無環圖就是從一個圖中的任何一點出發,不管走過多少個分叉路口,都沒有回到原來這個點的可能性
條件
- 每個頂點出現且只出現一次
- 若存在一條從頂點 A 到頂點 B 的路徑,那么在序列中頂點 A 出現在頂點 B 的前面,
計算一個DAG的拓撲關系
- 1→4表示4的入度+1,4是1的鄰接點
- 首先將邊與邊的關系確定,建立好入度表和鄰接表,
- 從入度為0的點開始洗掉,如上圖顯然是1的入度為0,先洗掉,
- 判斷有無環的方法,對入度陣列遍歷,如果有的點入度不為0,則表明有環,
- { 1, 2, 4, 3, 5 }
Storm介紹
Storm的簡介
- 分布式實時大資料處理框架,被業界稱為實時版Hadoop
- 流處理,不能進行批處理
Storm的優點
- Storm 實作的一些特征決定了它的性能和可靠性的
- Storm 的一個最有趣的地方是它注重容錯和管理
- 如果一個元組還未處理會自動從Spout處重發,Storm 還實作了任務級的故障檢測,在一個任務發生故障時,訊息會自動重新分配以快速重新開始處理
Storm的特性
-
適用場景廣泛
-
可伸縮性高
- Storm的可伸縮性可以讓storm每秒可以處理的訊息量達到很高,
- Storm使用ZooKeeper來協調集群內的各種配置使得Storm的集群可以很容易的擴展,
-
保證無資料丟失
- 實時系統必須保證所有的資料被成功的處理,storm保證每一條訊息都會被處理
-
例外健壯
- storm集群非常容易管理,輪流重啟節點不影回應用,
-
容錯性好:
- 在訊息處理程序中出現例外, storm會進行重試
-
語言無關性:
- Storm的topology和訊息處理組件(Bolt)可以用任何語言來定義, 這一點使得任何人都可以使用storm
Storm的物理架構
nimbus
- Storm的Master,負責資源分配和任務調度,一個Storm集群只有一個Nimbus,
- 集群的主節點,對整個集群的資源使用情況進行管理
- 但是nimbus是一個無狀態的節點,所有的一切都存盤在Zookeeper
supervisor
- Storm的Slave,負責接收Nimbus分配的任務,管理所有Worker
- 一個Supervisor節點中包含多個Worker行程,默認是4個
- 一般情況下一個topology對應一個worke
woker
- 作業行程(Process),每個作業行程中都有多個Task
Task
- 在 Storm 集群中每個 Spout 和 Bolt 都由若干個任務(tasks)來執行,
- worker中每一個spout/bolt的執行緒稱為一個task
- 同一個spout/bolt的task可能會共享一個物理執行緒(Thread),該執行緒稱為executor
Storm的并行機制
-
Topology由一個或多個Spout/Bolt組件構成,運行中的Topology由一個或多個Supervisor節點中的Worker構成
-
默認情況下一個Supervisor節點運行4個Worker,由defaults.yaml/storm.yaml中的屬性決定
- supervisor.slots.ports:6700 6701 6702 6703
- 在代碼中可以使用new Config().setNumWorkers(3),最大數量不能超過配置的supervisor.slots.ports數量,
-
Worker為特定拓撲的一個或多個組件Spout/Bolt產生一個或多個Executor,默認情況下一個Worker運行一個Executor,
-
Executor為特定拓撲的一個或多個組件Spout/Bolt實體運行一個或多個Task,默認情Executor運行一個Task況下一個
配置拓撲的并行度
Storm的計算架構
概述
-
流式計算框架
- 客戶端將資料發送給MQ(訊息佇列),然后傳遞到Storm中進行計算
- 最終計算的結果存盤到資料庫中(HBase,Mysql)
- 客戶端不要求服務器回傳結果,客戶端可以一直向Storm發送資料
- 客戶端相當于生產者,Storm相當于消費者
Topology
- 計算拓撲
- Storm 的拓撲是對實時計算應用邏輯的封裝,它的作用與 MapReduce 的任務(Job)很相似,
- 區別在于 MapReduce 的一個 Job 在得到結果之后總會結束,而拓撲會一直在集群中運行,直到你手動去終止它,
- 拓撲還可以理解成由一系列通過資料流(Stream Grouping)相互關聯的 Spout 和 Bolt 組成的的拓撲結構,
Stream
- 資料流(Streams)是 Storm 中最核心的抽象概念,
- 一個資料流指的是在分布式環境中并行創建、處理的一組元組(tuple)的無界序列,
- 資料流可以由一種能夠表述資料流中元組的域(fields)的模式來定義,
Tuple
- Stream中最小資料組成單元
- 每個tuple可以包含多列,欄位型別可以是: integer, long, short, byte, string, double, float,
- boolean和byte array,
Spout
-
資料源(Spout)是拓撲中資料流的來源,
-
一般 Spout 會從一個外部的資料源讀取元組然后將他們發送到拓撲中,
-
根據需求的不同,Spout 既可以定義為可靠的資料源,也可以定義為不可靠的資料源,
-
一個可靠的 Spout能夠在它發送的元組處理失敗時重新發送該元組,以確保所有的元組都能得到正確的處理
- storm在檢測到一個tuple被整個topology成功處理的時候呼叫ack, 否則呼叫fail
-
不可靠的 Spout 就不會在元組發送之后對元組進行任何其他的處理,
-
一個 Spout可以發送多個資料流,
Bolt
-
拓撲中所有的資料處理均是由 Bolt 完成的,
-
通過資料過濾(filtering)、函式處理(functions)、聚合(aggregations)、聯結(joins)、資料庫互動等功能
-
一個 Bolt 可以實作簡單的資料流轉換,而更復雜的資料流變換通常需要使用多個 Bolt 并通過多個步驟完成,
-
第一級Bolt的輸出可以作為下一級Bolt的輸入,而Spout不能有上一級,
-
Bolt 幾乎能夠完成任何一種資料處理需求,
-
Bolts的主要方法是execute(死回圈)連續處理傳入的tuple,
- 成功處理完每一個tuple呼叫OutputCollector的ack方法,以通知storm這個tuple被處理完成了,
- 處理失敗時,可以調fail方法通知Spout端可以重新發送該tuple
StreamGroup
- 為拓撲中的每個 Bolt 的確定輸入資料流是定義一個拓撲的重要環節,
- 資料流分組定義了在 Bolt 的不同任務(tasks)中劃分資料流的方式,在 Storm 中有八種內置的資料流分組方式,
Reliablity
- 可靠性
- Storm 可以通過拓撲來確保每個發送的元組都能得到正確處理,
- 通過跟蹤由 Spout 發出的每個元組構成的元組樹可以確定元組是否已經完成處理,
- 每個拓撲都有一個“訊息延時”引數,如果 Storm 在延時時間內沒有檢測到元組是否處理完成,就會將該元組標記為處理失敗,并會在稍后重新發送該元組,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379151.html
標籤:其他
