DStream
對(duì)DStream實(shí)施map,filter等操作操作黄选,會(huì)轉(zhuǎn)換成另外一個(gè)DStream,也就是說(shuō)DStream也有依賴關(guān)系DStream是一組連續(xù)的RDD序列,實(shí)際上就是在時(shí)間維度上對(duì)RDD集合的封裝办陷,DStream與RDD的關(guān)系就是隨著時(shí)間流逝不斷的產(chǎn)生RDD貌夕。如下圖所示:縱軸,DStream間的依賴實(shí)際上是轉(zhuǎn)化為內(nèi)部的RDD依賴關(guān)系民镜;橫軸啡专,隨著數(shù)據(jù)的流入,不斷產(chǎn)生新的DStream Graph制圈。
實(shí)際上DStream和RDD的關(guān)系如下所示:通過(guò)以時(shí)間為鍵值的哈希來(lái)創(chuàng)建RDD们童。
Input DStream
InputDStream是DStream最初誕生的地方,也是RDD最初誕生的地方,它是依據(jù)數(shù)據(jù)源創(chuàng)建的最初的DStream,比如基于Socket數(shù)據(jù)源創(chuàng)建了SocketInputDStream對(duì)象lines鲸鹦。從源碼角度分析是怎么生成RDD:SocketInputDStream生成RDD的方法在它的父類ReceiverInputDSteam慧库,其中的compute方法中調(diào)用了createBloackRDD方法基于Block信息創(chuàng)建了最初的RDD。
Transformed DStream
Transformed DStream是由其他DStream 通過(guò)非Output算子裝換而來(lái)的DStream亥鬓。常見(jiàn)的算子有:map完沪、flatMap、filter嵌戈、repartition覆积、union、count等熟呛。
通過(guò)flatMap生成FlatMappedDStream: val words= lines.flatMap(_.split(" “))
DStream的方法flatMap源碼:創(chuàng)建FlatMappeedDStream對(duì)象時(shí)傳入了參數(shù)flatMapFunc,即用戶的業(yè)務(wù)邏輯宽档。
FlatMappedDStream的compute方法調(diào)用了parent的getOrCompute方法獲取父DStream的RDD,flatMap和flatMapFunc生成新的RDD庵朝。
parent.getOrCompute依據(jù)DStream之間的依賴關(guān)系吗冤,將對(duì)DStream的操作都轉(zhuǎn)換成對(duì)RDD的操作,這樣DSream的依賴關(guān)系也與RDD之間依賴關(guān)系同時(shí)建立了起來(lái)九府。
Output DStream
Output DStream是其他DStream通過(guò)Output算子生成椎瘟,Output算子是讓DStream中的數(shù)據(jù)被推送的外部系統(tǒng)的操作。輸出操作觸發(fā)所有DStream的transformation操作的實(shí)際執(zhí)行侄旬,類似action肺蔚。常見(jiàn)的算子有:print、saveAsTextFiles儡羔、foreachRDD等宣羊。
通過(guò)print產(chǎn)生ForeachDStream:wordCounts.print()
DStream的方法print源碼:print定義了函數(shù)foreachFunc打印元素。
又調(diào)用了foreachRDD算子汰蜘,并將foreachFunc的處理邏輯作為參數(shù)傳入仇冯。
foreachRDD的內(nèi)部:創(chuàng)建了一個(gè)ForeachDStream對(duì)象,也就是Output DStream族操。