receiver方式 sparkStream啟動(dòng)一個(gè)單獨(dú)的線程receiver定時(shí)使用kafka高階API向kafka拉取數(shù)據(jù),并自動(dòng)地更新zk的offsets。
優(yōu)點(diǎn):用戶專注于業(yè)務(wù),不需要關(guān)心偏移量的維護(hù),代碼簡潔。
缺點(diǎn):定時(shí)拉取數(shù)據(jù)可能造成sparkStream處理速度跟不上,導(dǎo)致數(shù)據(jù)丟失。 啟動(dòng)wal預(yù)寫日志后,receiver會(huì)額外將數(shù)據(jù)寫一份到本地,數(shù)據(jù)丟失的情況可以自動(dòng)到日志中恢復(fù),但是這種方式會(huì)重復(fù)寫數(shù)據(jù)造成性能大幅浪費(fèi)。此外,receiver與業(yè)務(wù)不在同一線程,但兩者卻又相互依賴,這導(dǎo)致我們?cè)趯?duì)業(yè)務(wù)進(jìn)行高并發(fā)高吞吐的優(yōu)化時(shí)不得不受制于receiver。
direct方式sparkStream在業(yè)務(wù)代碼中使用kafka低階API直接連接kafka拉取數(shù)據(jù)進(jìn)行消費(fèi)。
優(yōu)點(diǎn): 簡化并行:kafka分區(qū)與RDD分區(qū)一致,可以一對(duì)一并行消費(fèi);
高效:數(shù)據(jù)的拉取與消費(fèi)是順序關(guān)系,不存在數(shù)據(jù)丟失問題,避免wal預(yù)寫日志
穩(wěn)定:處理完才拉取下一批數(shù)據(jù),不會(huì)造成任務(wù)積壓導(dǎo)致程序崩潰,強(qiáng)一致語義:可以通過手動(dòng)維護(hù)偏移量的方式自定義實(shí)現(xiàn)一致性。
:需要采用checkpoint或第三方平臺(tái)維護(hù)偏移量,開發(fā)成本較高;實(shí)現(xiàn)監(jiān)視需要額外人工開發(fā)。