Storm(流計算)技術原理 - 下
Streaming 的關鍵特性介紹
Nimbus HA:
容災
圖:容災示意圖
容災能力:節點失效,自動遷移到正常節點,業務不中斷。
整個過程無需人工干預!
消息可靠性:
可靠
可靠性級別設置:
如果並不要求每個消息必須被處理(允許在處理過程中丟失一些信息),那麼可以關閉消息的可靠性處理機制,從而可以獲得較好的性能。關閉消息的可靠性機制一位着系統中的消息數會減半。
有三種方法可以關閉消息的可靠性處理機制:
-
將參數 Config.TOPOLGY_ACKERS 設置爲 0.
-
Spout 發送一個消息時,使用不指定消息 message ID 的接口進行發送。
-
Blot 發送消息時使用 Unanchor 方式發送,使 Tuple 樹不往下延伸,從而關閉派生消息的可靠性。
ACK 機制:
ACK
圖:Ack 機制
-
一個 Spout 發送一個 Tuple 時,會通知 Acker 一個新的根消息產生了,Acker 會創建一個新的 Tuple tree,並初始化校驗和爲 0.
-
Bolt 發送消息時間向 Acker 發送 anchor tuple,刷新 tuple tree,並在發送成功後向 Acker 反饋結果。如果成功則重新刷新校驗和,如果失敗則 Acker 會立即通知 Spout 處理失敗。
-
當 Tuple tree 被完成吹了(校驗和爲 0),Acker 會通知 Spout 處理成功。
-
Spout 提供 ack()和 Fail()接口方法用戶處理 Acker 的反饋結果,需要用戶實現。一般在 fail()方法中實現消息重發邏輯。
Streaming 與其他組件:
其他組件
整合 HDFS/HBase 等外部組件,將實時結構提供給其他組件,進程離線分析。
Spark Streaming
Spark Streaming 設計:
Spark Streaming 可整合多種輸入數據源,如 Kafka、Flume、 HDFS,甚至是普通的 TCP 套接字。經處理後的數據可存儲至文件 系統、數據庫,或顯示在儀表盤裏。
Spark
圖:SPark Streaming 支持的輸入、輸出數據源
Spark Streaming 的基本原理是將實時輸入數據流以時間片(秒級)爲單位進行拆分,然後經 Spark 引擎以類似批處理的方式處理每個時間片數據。
處理
圖:Spark Streaming 執行流程
Spark Streaming 最主要的抽象是 DStream(Discretized Stream,離散化數據流),表示連續不斷的數據流。在內部實現上,Spark Streaming 的輸入數據按照時間片(如 1 秒)分成一段一段的 DStream,每一段數據轉換爲 Spark 中的 RDD,並且對 DStream 的操作都最終轉變爲對相應的 RDD 的操作。
Dsteam
圖:DStream 操作示意圖
Spark Streaming 與 Storm 的對比:
-
Spark Streaming 和 Storm 最大的區別在於,Spark Streaming 無法實現毫秒級的流計算,而 Storm 可以實現毫秒級響應。
-
Spark Streaming 構建在 Spark 上,一方面是因爲 Spark 的低延遲執行引擎(100ms+)可以用於實時計算,另一方面,相比於 Storm,RDD 數據集更容易做高效的容錯處理。
-
Spark Streaming 採用的小批量處理的方式使得它可以同時兼容批量和實時數據處理的邏輯和算法,因此,方便了一些需要歷史數據和實時數據聯合分析的特定應用場合。
Samza 技術原理
基本概念:
(1)作業:一個作業(Job)是對一組輸入流進行處理轉化成輸出流的程序。
(2)分區:
-
Samza 的流數據單位既不是 Storm 中的元組,也不是 Spark Streaming 中的 DStream,而是一條條消息。
-
Samza 中的每個流都被分割成一個或多個分區,對於流裏的每一個分區而言,都是一個有序的消息序列,後續到達的消息會根據一定規則被追加到其中一個分區裏。
(3)任務:
-
一個作業會被進一步分割成多個任務(Task)來執行,其中,每個任務負責處理作業中的一個分區。
-
分區之間沒有定義順序,從而允許每一個任務獨立執行。
-
YARN 調度器負責把任務分發給各個機器,最終,一個工作中的多個任務會被分發到多個機器進行分佈式並行處理。
(4)數據流圖:
-
一個數據流圖是由多個作業構成的,其中,圖中的每個節點表示包含數據的流,每條邊表示數據傳輸。
-
多個作業串聯起來就完成了流式的數據處理流程。
-
由於採用了異步的消息訂閱分發機制,不同任務之間可以獨立運行。
數據流圖
圖:數據流圖
Samza 的系統架構:
Samza 系統架構主要包括:
-
流數據層(Kafka)
-
執行層(YARN)
-
處理層(Samza API)
流處理層和執行層都被設計成可插拔的,開發人員可以使用其他框架來替代 YARN 和 Kafka。
類別
圖:MapReduce 批處理架構和 Samza 流處理架構對比
處理分析過程:
過程
圖:處理分析過程圖
處理分析過程如下:
-
Samza 客戶端需要執行一個 Samza 作業時,它會向 YARN 的 ResouceManager 提交作業請求。
-
ResouceManager 通過與 NodeManager 溝通爲該作業分配容器(包含了 CPU、內存等資源)來運行 Samza ApplicationMaster。
-
Samza ApplicationMaster 進一步向 ResourceManager 申請運行任務的容器。
-
獲得容器後,Samza ApplicationMaster 與容器所在的 NodeManager 溝通,啓動該容器,並在其中運行 Samza Task Runner。
-
Samza Task Runner 負責執行具體的 Samza 任務,完成流數據處理分析。
Storm、Spark Streaming 和 Samza 的應用場景
從編程的靈活性來講,Storm 是比較理想的選擇,它使用 Apache Thrift,可以用任何編程語言來編寫拓撲結構(Topology)。
當需要在一個集羣中把流計算和圖計算、機器學習、SQL 查詢分析等進行結合時,可以選擇 Spark Streaming,因爲,在 Spark 上可以統一部署 Spark SQL,Spark Streaming、MLlib,GraphX 等組件,提供便捷的一體化編程模型。
當有大量的狀態需要處理時,比如每個分區都有數十億個元組,則可以選擇 Samza。當應用場景需要毫秒級響應時,可以選擇 Storm 和 Samza,因爲 Spark Streaming 無法實現毫秒級的流計算。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/xt8suF859a5qhvLd576sAg