2016-12-06 53 views
1

假設,我有一個應用程序是否緩存了mapWithState/updateStateByKey?

  1. 從卡夫卡
  2. 創建一個新的數據流做一些轉換
  3. 使用mapWithState/updateStateByKey保存狀態。
  4. 對來自狀態的流進行一些更多的轉換。
  5. 做一些動作1和動作2。

注:我還沒有使用任何緩存。

我的問題是,

  • 將在第2步轉換中(對於動作1次和動作2個)進行了兩次?對我來說,它似乎只執行一次!
  • mapWithState/updateStateByKey return dStream,但是它會自動執行一些緩存/存儲嗎?
  • 是否有擔保,mapWithState/updateStateByKey之前的轉換僅應用一次而不重新計算?我的意思是,如果狀態仍包含30天前獲取的數據,它是否會重新計算預先計算的結果未找到?

回答

1

將在步驟2中的變換(一次動作1 和動作2的每個)進行兩次?對我來說,它似乎只執行一次

這真的取決於我們正在談論的轉換。如果你有一個圖的兩個分支,每個分支並行計算,它應該可以工作。

mapWithState/updateStateByKey返回DSTREAM,但它做一些 緩存/自動存儲?

這些轉換的重點是在迭代之間保持狀態,這就是他們所做的。 mapWithState有一個明確的State[S]對象,您可以自己添加/更新/刪除。

是否有擔保的,之前 mapWithState/updateStateByKey的轉換應用只有一次,而不是 重新計算的?我的意思是,如果狀態仍然包含30天 之前採集的數據,將它重新計算如果不是mapWithStateupdateStateByKey無國籍發現

所有轉換等預先計算的結果。如果整個RDD缺少一個必要的數據,它可以請求重新計算RDD丟失的部分。如果這就是你的意思。