實時計算框架特點及對比:Flink、Spark Streaming、Storm

danny_2018發表於2023-01-18

隨著網際網路和大資料技術的發展,實時計算框架也在推陳出新,向著高吞吐、高可用、低延遲準實時的方向發展。具體而言,主流的計算引擎不外乎三個:Flink、Spark Streaming、Storm。本文從幾個方面總結了各框架的優缺點,希望對讀者進行架構設計和技術選型提供幫助。

各框架對比

1、設計理念

Flink

Flink是事件驅動的實時計算框架,是一個針對流資料和批資料的分散式處理引擎。它認為批是流的特例,資料流分為有限流(Bounded)和無限流(Unbounded),離線計算是對有限資料流的批處理,實時計算是對無限資料流的連續處理。有限流是有明確的開始和結束時間,無限流有明確的開始時間但沒有結束時間。Flink是基於事件驅動,內部是對訊息逐條emit。

同時,Flink 主要是由 Java 程式碼實現,其所要處理的主要場景就是流資料,批資料只是流資料的一個極限特例而已。

換句話說,Flink 會把所有任務當成流來處理,這也是其最大的特點。Flink 可以支援本地的快速迭代,以及一些環形的迭代任務。並且 Flink 可以定製化記憶體管理。在這點,如果要對比 Flink 和 Spark 的話,Flink 並沒有將記憶體完全交給應用層。這也是為什麼 Spark 相對於 Flink,更容易出現 OOM 的原因(out of memory)。就框架本身與應用場景來說,Flink 更相似於 Storm。

Spark Streaming

Spark Streaming是在 Spark Core API基礎上擴充套件出來的,以微批模式實現的近實時計算框架,它認為流是批的特例,將輸入資料切分成一個個小的切片,利用Spark引擎作為一個個小的batch資料來處理,最終輸出切片流,以此實現近似實時計算。

Spark Streaming並不會像Storm那樣一次一個地處理資料流,而是在處理前按時間間隔預先將其切分為一段一段的批處理作業。Spark針對持續性資料流的抽象稱為DStream(DiscretizedStream),一個DStream是一個微批處理(micro-batching)的RDD(彈性分散式資料集);而RDD則是一種分散式資料集,能夠以兩種方式並行運作,分別是任意函式和滑動視窗資料的轉換

Storm

Storm也是一個事件驅動的實時流計算框架,完全由開發者自己定義訊息被處理的拓撲結構(Topology)。換言之,在Storm中,先要設計一個用於實時計算的圖狀結構,我們稱之為拓撲(topology),它的結構和Mapreduce任務類似,透過自定定義Spout(資料輸入處理模組)和Bolt(輸出處理模組)邏輯,以及自定義Bolt之間的拓撲依賴關係,完成整個實時事件流的處理邏輯搭建。

期間,Topology這個拓撲將會被提交給叢集,由叢集中的主控節點(master node)分發程式碼,將任務分配給工作節點(worker node)執行。一個拓撲中包括spout和bolt兩種角色,其中spout傳送訊息,負責將資料流以tuple元組的形式傳送出去;而bolt則負責轉換這些資料流,在bolt中可以完成計算、過濾等操作,bolt自身也可以隨機將資料傳送給其他bolt。由spout發射出的tuple是不可變陣列,對應著固定的鍵值對。

Trident是在Storm核心API基礎上更高層次的抽象,以微批的方式處理實時流,增加了視窗操作、聚合操作等,並且支援Exactly once。

2、基礎架構

Flink

實時計算框架特點及對比:Flink、Spark Streaming、Storm

Flink 資料模型是基於流(Streams)和轉換(Transformations),由一個或多個 Source作為輸入,並終止於一個或多個 Sink,透過不同的轉換運算元對資料流進行處理。

JobManager:協調分散式任務執行、排程、協調 checkpoints、協調故障恢復等。高可用情況下可以啟動多個 JobManager,其中一個選舉為 leader,其餘為 standby

TaskManager:負責執行具體的task、快取、交換資料流

Slot:每個 task slot 代表 TaskManager 的一個固定資源,Slot 的個數代表著 TaskManager 可並行執行的 task 數。

對於 Flink 任務客戶端首先會生成 StreamGraph,然後生成 JobGraph,將 JobGraph 提交給 JobManager 由它完成 JobGraph 到 ExecutionGraph 的轉換,最後由 JobManager 排程執行。

Spark Streaming

Spark Streaming整體架構和Spark一致,角色主要有:

Master:負責叢集資源管理和應用程式排程

Worker:負責單個節點的資源管理,driver 和 executor 的啟動等

Driver:程式執行入口,初始化SparkContext,負責生成DAG 、劃分stage、生成排程task;

Executor:負責執行 task,反饋執行狀態和執行結果

對於輸入的每個批次都是一個Spark Core任務,Spark Streaming每個批次執行的拓撲結構不固定,會根據資料本地性和資源情況進行排程。

Storm

Nimbus:master節點,負責提交任務,分配到supervisor的worker上

Supervisor:slave節點,負責管理執行在supervisor節點上的worker程式,worker負責執行Topology上的Spout/Bolt任務

總結

Flink目前已經被各大網際網路公司廣泛使用,已經成為業界事實標準。Spark Streaming 在高吞吐複雜計算場景仍具優勢。Storm 是最早流行的實時計算框架,但由於開發維護較複雜,功能簡單,後逐漸被取代,新版本也增加了對事件時間、watermark、視窗計算的支援,成熟度和易用性還不足。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547898/viewspace-2932498/,如需轉載,請註明出處,否則將追究法律責任。