謝艷晴
摘要:Spark Streaming作為目前最為流行的一種實時流計算框架,在大數(shù)據(jù)時代,企業(yè)搭建實時計算平臺中占據(jù)著舉足輕重的地位。其良好的擴展性、高吞吐量以及容錯機制能夠滿足我們很多場景應用。
關鍵詞:Spark Streaming;實時計算
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)25-0258-02
隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)呈爆炸式的增長,原本單機的數(shù)據(jù)處理已經(jīng)無法滿足大數(shù)據(jù)時代業(yè)務的場景需要,如每日GB/TB級離線日志分析,網(wǎng)站/APP海量用戶的點擊瀏覽行為在線分析等等。在需求的驅動下,業(yè)界很快打造出了一些優(yōu)秀的分布式計算框架,如Hadoop、Spark等。
實時計算是一種在線的將海量數(shù)據(jù)實時進行分析處理,一般延時限制在秒級的應用場景。該場景的數(shù)據(jù)源是實時的不間斷的,比如對于大型網(wǎng)站、海量用戶APP的流式數(shù)據(jù):用戶點擊了什么功能,搜索了什么內(nèi)容等,實時的數(shù)據(jù)計算和處理可以實現(xiàn)實時營銷(商品推薦、優(yōu)惠券活動),也可以實現(xiàn)動態(tài)實時地監(jiān)控網(wǎng)站不同時段的用戶流量和用戶分布的監(jiān)控。實時計算系統(tǒng)在互聯(lián)網(wǎng)公司擁有不可估量的價值,尤其是對電商平臺、金融互聯(lián)網(wǎng)平臺等,需要從用戶的實時行為中計算分析做營銷的平臺。
1 Spark Streaming實時計算框架
1.1 Spark Streaming簡介
為了滿足實時計算場景的需求,使數(shù)據(jù)處理能夠達到實時的響應和反饋,又隨之出現(xiàn)了實時計算框架:Apache Storm、Apache Flink以及Spark Streaming等。一個項目除了實時計算之外,還往往會包括離線批處理、交互式查詢等業(yè)務功能。Spark Streaming是基于Spark Core API,所以與Spark中的其他模塊Spark Core(離線批處理)、Spark SQL(交互式查詢)能夠保持非常好的兼容性,三者可以進行無縫整合,給系統(tǒng)提供非常高的可擴展性。所以Spark Streaming是目前在企業(yè)中最為流行的實時計算框架。
Spark Streaming可以從多種實時數(shù)據(jù)源讀取數(shù)據(jù),例如Kafka、Flume、Kinesis以及TCP sockets,也可以通過例如map,reduce,join,window等的高級函數(shù)組成的復雜算法處理。最終將處理后的數(shù)據(jù)持久化到HDFS,數(shù)據(jù)庫或者實時儀表盤中[1]。
在內(nèi)部,它的工作原理如下圖2所示,Spark Streaming接收實時輸入數(shù)據(jù)流并將數(shù)據(jù)切分成batch(批)數(shù)據(jù),然后由Spark引擎處理它們以生成最終的分批流結果。
1.2 Spark Streaming優(yōu)劣對比
Spark Streaming不是真正的流失處理框架,而是一次處理一批數(shù)據(jù)。這種粗粒度的準實時處理框架,一次讀完或異步讀完之后處理數(shù)據(jù),且其計算可基于大內(nèi)存進行,因此具有較高的吞吐量,但是不可以避免會出現(xiàn)相應的計算延時,所以Spark Streaming適合秒級響應的準實時計算系統(tǒng)[2]。
Storm是純流式的實時計算框架,用于不能忍受1秒以上延時的場景使用,比如實時金融系統(tǒng),要求純實時進行金融交易和分析。若Storm框架在程序中需要對數(shù)據(jù)進行延時批處理和交互查詢時,在編程實現(xiàn)方面就沒有Spark Streaming來得更加簡單,快捷些。
2 Spark Streaming消費Kafka
Kafka是實時數(shù)據(jù)源的一種,本文以kakfa為例,重點研究Spark Streaming消費kafka的兩種方式[3]。
2.1 Receiver DStream
容器方式采用Kafka高階API以建造容器的方式來專門、持續(xù)不斷、異步讀取Kafka的數(shù)據(jù)、讀取時間間隔以及每次讀取offsets范圍可以由參數(shù)來配置。讀取的數(shù)據(jù)保存在Receiver中,當driver觸發(fā)batch任務的時候,Receiver中的數(shù)據(jù)會轉移到剩余的Executor中去執(zhí)行。在執(zhí)行完畢之后,Receiver會相應更新Zookeeper的offsets。該方式為保證數(shù)據(jù)不丟失,可通過配置spark.streaming.receiver.writeAheadLog.enable參數(shù),使數(shù)據(jù)保存兩份,但是也會造成存儲浪費和影響效率。
2.2 Direct DStream
直接方式采用Kafka簡單的consumer api方式來讀取數(shù)據(jù),無須經(jīng)由zookeeper,此方式也不需要專門Receiver來持續(xù)讀取數(shù)據(jù)。當batch任務觸發(fā)時,由Executor讀取數(shù)據(jù),并參與到其他Executor的數(shù)據(jù)計算過程中去。Driver來決定讀取多少offsets,并將offsets交由checkpoints來維護。將觸發(fā)下次batch任務,再由Executor讀取kakfa數(shù)據(jù)并計算。相比于Receiver方法,該方式效率有了明顯提示,并且節(jié)約了計算資源,但是沒有維護zookeeper,故在監(jiān)控可視化方面,需要單獨對zookeeper進行維護。
3 結論
實時計算在各大電商、金融等平臺中已經(jīng)成為不可或缺的一部分。實時計算框架中Spark Streaming相比于其他框架,因其作為Spark生態(tài)中的一部分所以在項目中更加實用。本文概述了Spark Streaming的特點和工作原理,之后以高級實時數(shù)據(jù)源Kafka為例,剖析了Streaming消費Kafka的兩種模型,并論述了兩種模型的優(yōu)缺點,為讀者搭建實時計算系統(tǒng)提供參考。
參考文獻:
[1] 黨壽江,劉學,王星凱,等.基于Spark Streaming的實時數(shù)據(jù)采集分析系統(tǒng)設計[J].網(wǎng)絡新媒體技術,2017,6(5):48-53.
[2] 裴國才.流計算及其在電信實時營銷中的應用[J].信息通信,2018(3).
[3] 韓德志,陳旭光,雷雨馨,等.基于Spark Streaming的實時數(shù)據(jù)分析系統(tǒng)及其應用[J].計算機應用,2017,37(5):1263-1269.
【通聯(lián)編輯:梁書】