SparkStreaming狀態計算(updateStateByKey mapWithState)區別

updateStateByKey 算子

返回的是帶有狀態的DStream,在這個DStream裡面,每一個key的狀態是可以被更新的,通過一個給定的函數,把之前的key的狀態和當前key新的狀態聯合起來計算,用於維持每個key的任意狀態。說白了也就是說每一次的老的計算狀態都給記錄下來,新的計算狀態用於去更新老的狀態。

也即是說它會統計全局的key的狀態,就算沒有數據輸入,它也會在每一個批次的時候返回之前的key的狀態。

缺點:若數據量太大的話,需要checkpoint的數據會佔用較大的存儲,效率低下。

兩步驟:

  1. Define the state - The state can be an arbitrary data type.
  2. Define the state update function - Specify with a function how to update the state using the previous state and the new values from an input stream.
SparkStreaming狀態計算(updateStateByKey mapWithState)區別

不論是否重啟,程序的運行狀態都保存完好

SparkStreaming狀態計算(updateStateByKey mapWithState)區別

mapWithState (生產中推薦使用)

mapWithState:也是用於全局統計key的狀態,但是它如果沒有數據輸入,便不會返回之前的key的狀態,有一點增量的感覺。效率更高,生產中建議使用

優點:我們可以只是關心那些已經發生的變化的key,對於沒有數據輸入,則不會返回那些沒有變化的key的數據。這樣的話,即使數據量很大,checkpoint也不會像updateStateByKey那樣,佔用太多的存儲

SparkStreaming狀態計算(updateStateByKey mapWithState)區別


分享到:


相關文章: