UpdataStateBykey updataStateBykey是特殊的reduceByKey, 相當(dāng)于oldValue+reduceByKey(newValue1,newValue2),通過(guò)傳入一個(gè)updateFunc來(lái)實(shí)現(xiàn)批次間數(shù)據(jù)累加的操作。
實(shí)現(xiàn)它必須設(shè)置checkPoint路徑,updataStateBykey會(huì)自動(dòng)將每次計(jì)算的結(jié)果持久化到磁盤,批次間的數(shù)據(jù)則是緩存在內(nèi)存中。
缺點(diǎn):大量占用內(nèi)存,大量產(chǎn)生小文件 MapwithState mapwithState是spark1.6新增的累加操作,目前還在測(cè)試中,它的原理網(wǎng)上查不到,只知道是updataStateBykey的升級(jí)版,效率提升10倍。
缺點(diǎn):資料不全,社區(qū)很小 不建議使用狀態(tài)流累加操作,建議用窗口+第三方存儲(chǔ)(redis)來(lái)達(dá)到同樣的效果。
Spark Streaming中的updateStateByKey和mapWithState的區(qū)別和使用。
UpdateStateByKey:統(tǒng)計(jì)全局的key的狀態(tài),但是就算沒(méi)有數(shù)據(jù)輸入,他也會(huì)在每一個(gè)批次的時(shí)候返回之前的key的狀態(tài)。
這樣的缺點(diǎn)就是,如果數(shù)據(jù)量太大的話,而且我們需要checkpoint數(shù)據(jù),這樣會(huì)占用較大的存儲(chǔ)。
如果要使用updateStateByKey,就需要設(shè)置一個(gè)checkpoint目錄(updateStateByKey自己是無(wú)法保存key的狀態(tài)的),開(kāi)啟checkpoint機(jī)制。因?yàn)閗ey的state是在內(nèi)存維護(hù)的,如果宕機(jī),則重啟之后之前維護(hù)的狀態(tài)就沒(méi)有了,所以要長(zhǎng)期保存它的話需要啟用checkpoint,以便恢復(fù)數(shù)據(jù)。
MapWithState:也是用于全局統(tǒng)計(jì)key的狀態(tài),但是它如果沒(méi)有數(shù)據(jù)輸入,便不會(huì)返回之前的key的狀態(tài),有一點(diǎn)增量的感覺(jué)。
這樣做的好處是,我們可以只關(guān)心那些已經(jīng)發(fā)生變化的key,對(duì)于沒(méi)有數(shù)據(jù)輸入,則不會(huì)返回那些沒(méi)有變化的key的數(shù)據(jù)。
這樣即使數(shù)據(jù)量很大,checkpoint也不會(huì)像updateStateByKey那樣,占用太多的存儲(chǔ)。