—————?—————?—————?—————?—————?—————
Spark Streaming概述
Spark Streaming 初始化過(guò)程
Spark Streaming Receiver啟動(dòng)過(guò)程分析
Spark Streaming 數(shù)據(jù)準(zhǔn)備階段分析(Receiver方式)
Spark Streaming 數(shù)據(jù)計(jì)算階段分析
SparkStreaming Backpressure分析
Spark Streaming Executor DynamicAllocation 機(jī)制分析
—————?—————?—————?—————?—————?—————
1廷没、流式計(jì)算分類
目前丰榴,流式計(jì)算的實(shí)現(xiàn)方案有如下兩種模型:
⑴連續(xù)算子模型(continuous operator model),連續(xù)算子模型中數(shù)據(jù)流被表達(dá)成算子圖。數(shù)據(jù)被一個(gè)算子處理后室梅,發(fā)送給另一個(gè)算子做進(jìn)一步處理,如Storm, S4等;
⑵批量流式計(jì)算模型,這類模型將流入的數(shù)據(jù)流按固定時(shí)間片分割為一系列數(shù)據(jù)塊烂斋,并按時(shí)間窗口將流式計(jì)算分解成一連串短小的批處理作業(yè)辽俗,各批處理作業(yè)處理落在其時(shí)間窗口內(nèi)的數(shù)據(jù)集合。如Spark Streaming,Comet等;
2拴魄、Spark Streaming概述
Spark Streaming是大規(guī)模流式數(shù)據(jù)處理的新貴冗茸,是一種構(gòu)建在Spark上的實(shí)時(shí)計(jì)算框架,它將流式計(jì)算分解成一系列短小的批處理作業(yè)匹中,擴(kuò)展了Spark處理大規(guī)模流式數(shù)據(jù)的能力夏漱。其隸屬批量流式計(jì)算模型, 其處理流程如下:
Spark Streaming接收源源不斷的數(shù)據(jù)流,并將數(shù)據(jù)流按切片間隔(BlockInterval)進(jìn)行切片顶捷,并按時(shí)間窗口(BatchInterval)將流式計(jì)算分解成一連串短小的批處理作業(yè)挂绰,各批處理作業(yè)處理落在其時(shí)間窗口內(nèi)的數(shù)據(jù)集合。批處理作業(yè)以批處理的方式執(zhí)行服赎,并輸出執(zhí)行結(jié)果葵蒂。
Spark Streaming 對(duì)數(shù)據(jù)計(jì)算的過(guò)程可以分解為數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)計(jì)算兩個(gè)階段芳室。后序章節(jié)會(huì)就兩個(gè)階段分別進(jìn)行分析。
3刹勃、 DStream介紹
DStream 是Spark Streaming中一個(gè)關(guān)鍵的程序抽象堪侯,表示從數(shù)據(jù)源獲取持續(xù)性的數(shù)據(jù)流,并提供DStream之間的轉(zhuǎn)換算子:Transformation與Output算子(分別與RDD的Transformation與action算子對(duì)應(yīng))荔仁,DStream之間的的轉(zhuǎn)換所形成的依賴關(guān)系類似于RDD之間的依賴伍宦。其InputDStream與OutputDStream信息會(huì)保存在DStreamGraph中(DstreamGraph在StreamingContext創(chuàng)建時(shí)初始化),DStreamGraph會(huì)定期生成RDD DAG乏梁,因此次洼,DStream可以代表一系列連續(xù)的RDD,如下圖所示:
另外遇骑, DStream之間的Transformation操作也同RDD的Transformation類似卖毁,屬于延遲操作。
4落萎、Spark Streaming應(yīng)用示例
Spark Streaming應(yīng)用程序(WordCount)實(shí)現(xiàn)如下:
val conf = new SparkConf().setAppName("wordCount").setMaster("local[4]")
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(10))
val lines = ssc.socketTextStream("localhost", 8585, StorageLevel.MEMORY_ONLY)
val words = lines.flatMap(_.split(" ")).map(w => (w,1))
val wordCount = words.reduceByKey(_+_)
wordCount.print
ssc.start()