Spark Streaming實時計算框架介紹
隨着大數據的發展,人們對大數據的處理要求也越來越高,原有的批處理框架MapReduce適合離線計算,卻無法滿足實時性要求較高的業務,如實時推薦、用戶行為分析等。 Spark Streaming是建立在Spark上的實時計算框架,通過它提供的豐富的API、基於內存的高速執行引擎,用戶可以結合流式、批處理和交互試查詢應用。本文將詳細介紹Spark Streaming實時計算框架的原理與特點、適用場景。
Spark Streaming實時計算框架
Spark是一個類似於MapReduce的分布式計算框架,其核心是彈性分布式數據集,提供了比MapReduce更豐富的模型,可以在快速在內存中對數據集進行多次迭代,以支持復雜的數據挖掘算法和圖形計算算法。Spark Streaming是一種構建在Spark上的實時計算框架,它擴展了Spark處理大規模流式數據的能力。
Spark Streaming的優勢在於:
-
能運行在100+的結點上,並達到秒級延遲。
-
使用基於內存的Spark作為執行引擎,具有高效和容錯的特性。
-
能集成Spark的批處理和交互查詢。
-
為實現復雜的算法提供和批處理類似的簡單接口。
基於雲梯Spark on Yarn的Spark Streaming總體架構如圖1所示。其中Spark on Yarn的啟動流程我的另外一篇文章(《程序員》2013年11月期刊《深入剖析阿里巴巴雲梯Yarn集群》)有詳細描述,這里不再贅述。Spark on Yarn啟動后,由Spark AppMaster把Receiver作為一個Task提交給某一個Spark Executor;Receive啟動后輸入數據,生成數據塊,然后通知Spark AppMaster;Spark AppMaster會根據數據塊生成相應的Job,並把Job的Task提交給空閑Spark Executor 執行。圖中藍色的粗箭頭顯示被處理的數據流,輸入數據流可以是磁盤、網絡和HDFS等,輸出可以是HDFS,數據庫等。
圖1 雲梯Spark Streaming總體架構
Spark Streaming的基本原理是將輸入數據流以時間片(秒級)為單位進行拆分,然后以類似批處理的方式處理每個時間片數據,其基本原理如圖2所示。
圖2 Spark Streaming基本原理圖
首先,Spark Streaming把實時輸入數據流以時間片Δt (如1秒)為單位切分成塊。Spark Streaming會把每塊數據作為一個RDD,並使用RDD操作處理每一小塊數據。每個塊都會生成一個Spark Job處理,最終結果也返回多塊。
下面介紹Spark Streaming內部實現原理。
使用Spark Streaming編寫的程序與編寫Spark程序非常相似,在Spark程序中,主要通過操作RDD(Resilient Distributed Datasets彈性分布式數據集)提供的接口,如map、reduce、filter等,實現數據的批處理。而在Spark Streaming中,則通過操作DStream(表示數據流的RDD序列)提供的接口,這些接口和RDD提供的接口類似。圖3和圖4展示了由Spark Streaming程序到Spark jobs的轉換圖。
圖3 Spark Streaming程序轉換為DStream Graph
圖4 DStream Graph轉換為Spark jobs
在圖3中,Spark Streaming把程序中對DStream的操作轉換為DStream Graph,圖4中,對於每個時間片,DStream Graph都會產生一個RDD Graph;針對每個輸出操作(如print、foreach等),Spark Streaming都會創建一個Spark action;對於每個Spark action,Spark Streaming都會產生一個相應的Spark job,並交給JobManager。JobManager中維護着一個Jobs隊列, Spark job存儲在這個隊列中,JobManager把Spark job提交給Spark Scheduler,Spark Scheduler負責調度Task到相應的Spark Executor上執行。
Spark Streaming的另一大優勢在於其容錯性,RDD會記住創建自己的操作,每一批輸入數據都會在內存中備份,如果由於某個結點故障導致該結點上的數據丟失,這時可以通過備份的數據在其它結點上重算得到最終的結果。
正如Spark Streaming最初的目標一樣,它通過豐富的API和基於內存的高速計算引擎讓用戶可以結合流式處理,批處理和交互查詢等應用。因此Spark Streaming適合一些需要歷史數據和實時數據結合分析的應用場合。當然,對於實時性要求不是特別高的應用也能完全勝任。另外通過RDD的數據重用機制可以得到更高效的容錯處理。