Spark Streaming源碼分析 – InputDStream


對於NetworkInputDStream而言,其實不是真正的流方式,將數據讀出來后不是直接去處理,而是先寫到blocks中,后面的RDD再從blocks中讀取數據繼續處理
這就是一個將stream離散化的過程
NetworkInputDStream就是封裝了將數據從source中讀出來,然后放到blocks里面去的邏輯(Receiver線程)
還需要一個可以管理NetworkInputDStream,以及把NetworkInputDStream.Receiver部署到集群上執行的角色,這個就是NetworkInputTracker
NetworkInputTracker會負責執行一個獨立的job,把各個Receiver以RDD的task的形式,分布到各個worknode上去執行

InputDStream

 

NetworkInputDStream

NetworkInputDStream是比較典型的Input,主要接口兩個
getReceiver,Receiver對於NetworkInputDStream是最關鍵的,里面封裝了如果從數據源讀到數據,如果切分並寫到blocks中去
compute,由於Receiver只會把數據寫到blocks中去,問題我們如何取到這些數據了?
Receiver在寫block的同時,會發event給networkInputTracker注冊block
所以NetworkInputDStream.compute是無法直接算出數據來,而是先從networkInputTracker查詢出blockids,並從BlockManager中讀出數據


NetworkReceiver

NetworkReceiverActor
用於將Receiver的event轉發給TrackerActor

BlockGenerator
3個關鍵的接口,
+=,用於調用者將數據不斷加到currentBuffer上
updateCurrentBuffer,定時將currentBuffer的數據,生成block對象放到blocksForPushing隊列上(blockIntervalTimer調用)
keepPushingBlocks, 不斷將
blocksForPushing隊列上的blocks取出,並寫到blockmanager中去(blockPushingThread調用)

 

SocketInputDStream

Socket作為最為典型的NetworkInputDStream,看看是如何實現的
對於SocketInputDStream,關鍵實現getReceiver接口,可以獲取SocketReceiver對象
而對於SocketReceiver關鍵是實現onStart接口,將從socket上讀到的數據寫到blockGenerator的currentBuffer上

 

NetworkInputTracker

NetworkInputTracker用於管理和監控所有的NetworkInputDStream
首先NetworkInputTrackerActor,可以從NetworkInputDStream接收RegisterReceiver,AddBlocks,和DeregisterReceiver事件
從而知道有多少NetworkInputDStream,並且每個讀取並存儲了多少的blocks

再者,在ReceiverExecutor中他負責啟動所有NetworkInputDStream的Receivers,做法比較奇特,也是依賴於RDD
將每個receiver封裝在RDD的一個partition里,partition會作為一個task被調度,最后runjob去執行startReceiver,這樣每個receiver都會在task被執行的時候start

而外部通過getBlockIds,來取得某NetworkInputDStream所有的blockids,從而取到數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM