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