2016-11-13 32 views
2

我已經通過this stackoverflow的問題,根據答案它創建一個DStream與批間隔只有一個RDDDStream的RDD是否一次性爲整批間隔創建整個數據?

例如:

我的批次間隔是1分鐘和Spark流作業從卡夫卡主題消耗數據。

我的問題是,DStream中可用的RDD是否在最後一分鐘內提取/包含整個數據?我們需要設置什麼標準或選項來提取最後一分鐘創建的所有數據?

如果我有一個帶有3個分區的卡夫卡主題,並且所有3個分區都包含最後一分鐘的數據,那麼DStream是否將包含所有卡夫卡主題分區中最後一分鐘創建的所有數據?

更新:

在這種情況下DSTREAM包含不止一個RDD?

回答

2

Spark Streaming DStream正在消耗來自Kafka主題的數據,該主題被分區,例如在3個不同的Kafka代理上分配給3個分區。

DStream中可用的RDD是否在最後一分鐘內提取/包含整個數據?

不完全。 RDD 只有描述了從任務提交執行時讀取數據的偏移量。它就像在Spark中的其他RDD一樣,它們只有只有(?)說明在提交任務時要做什麼以及在哪裏找到要處理的數據。

如果你用更寬鬆的方式使用「拉/包含」來表示在某些時刻記錄(來自給定偏移處的分區)將被處理,是的,你是對的,整個分鐘被映射到偏移量,而偏移量又被映射到Kafka提交處理的記錄。

在所有的卡夫卡主題分區?

是的。 Kafka不一定需要Spark Streaming/DStream/RDD來處理它。 DStream的RDD會根據主題及其分區的偏移量從上次查詢到現在請求記錄。

對於Kafka,Spark Streaming的分鐘可能略有不同,因爲DStream的RDD包含偏移量記錄,而不是每次記錄的記錄。

在哪種情況下DStream包含多個RDD?

從來沒有。

2

我建議閱讀Spark documentation中關於DStream抽象的更多信息。

離散流DSTREAM是由火花流提供的基本抽象。它代表了連續的數據流[...]。在內部,DStream由連續系列的RDD表示。

我會一個點添加到–不要忘記,RDD本身是抽象的另一層,所以它可以分成更小的塊和整個集羣傳播。

考慮您的問題:

  • 是,每批間隔大火後,有一個RDD工作。此RDD包含前一分鐘的所有數據。
  • 如果您的作業使用更多分區的Kafka流,則所有分區將並行使用。所以結果是來自所有分區的數據在隨後的RDD中被處理。
1

被忽視的一件重要事情是Kafka有多個Spark Streaming實現。

一個是基於接收器的方法,它在選定的Worker節點上建立一個接收器並讀取數據,對其進行緩衝並分配。

另一種是無接收方式,這是完全不同的。它在運行驅動程序的節點中僅消耗偏移量,然後在分配任務時向每個執行程序發送一系列偏移量以讀取和處理。這樣,就沒有緩衝(因此,無需接收器),並且每個偏移量都由工作者上運行的互斥執行程序進程消耗。

DStream拉/包含所有Kafka主題分區中最後一分鐘創建的所有數據?

在這兩種方法中,它都會。一分鐘間隔命中,它將嘗試從Kafka讀取數據並將其傳播到羣集中進行處理。

在這種情況下,DSTREAM包含不止一個RDD

正如其他人說,這不可能發生。在給定的時間間隔內,只有一個RDD在DStream內部流動。