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