1. 程式人生 > >Spark Streaming 輸入DStream和Receiver詳解

Spark Streaming 輸入DStream和Receiver詳解

輸入DStream和Receiver詳解

  輸入DStream代表了來自資料來源的輸入資料流。在之前的wordcount例子中,lines就是一個輸入DStream(JavaReceiverInputDStream),代表了從netcat(nc)服務接收到的資料流。除了檔案資料流之外,所有的輸入DStream都會繫結一個Receiver物件,該物件是一個關鍵的元件,用來從資料來源接收資料,並將其儲存在Spark的記憶體中,以供後續處理。

Spark Streaming提供了兩種內建的資料來源支援;

  1. 基礎資料來源:StreamingContext API中直接提供了對這些資料來源的支援,比如檔案、socket、Akka Actor等。
  2. 高階資料來源:諸如Kafka、Flume、Kinesis、Twitter等資料來源,通過第三方工具類提供支援。這些資料來源的使用,需要引用其依賴。
  3. 自定義資料來源:我們可以自己定義資料來源,來決定如何接受和儲存資料。

  要注意的是,如果你想要在實時計算應用中並行接收多條資料流,可以建立多個輸入DStream。這樣就會建立多個Receiver,從而並行地接收多個數據流。但是要注意的是,一個Spark Streaming Application的Executor,是一個長時間執行的任務,因此,它會獨佔分配給Spark Streaming Application的cpu core。從而只要Spark Streaming執行起來以後,這個節點上的cpu core,就沒法給其他應用使用了。

  使用本地模式,執行程式時,絕對不能用local或者local[1],因為那樣的話,只會給執行輸入DStream的executor分配一個執行緒。而Spark Streaming底層的原理是,至少要有兩條執行緒,一條執行緒用來分配給Receiver接收資料,一條執行緒用來處理接收到的資料。因此必須使用local[n],n>=2的模式。

  如果不設定Master,也就是直接將Spark Streaming應用提交到叢集上執行,那麼首先,必須要求叢集節點上,有>1個cpu core,其次,給Spark Streaming的每個executor分配的core,必須>1,這樣,才能保證分配到executor上執行的輸入DStream,兩條執行緒並行,一條執行Receiver,接收資料;一條處理資料。否則的話,只會接收資料,不會處理資料。

  因此,如果使用的是本地模式,那麼我們都應該是基於local[2]的本地模式,給每個executor的cpu core,設定為超過1個即可。