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