如何使用Spark Streaming Kafka如何實現精確一次語義?

時間 2021-05-12 01:11:54

1樓:小怪獸

消費端精準一次性只需要保證至少一次+冪等性即可, 至少一次比較好保證, 比如我們手動維護 offset, 先消費資料, 再提交或維護 offset, 這樣至少可以保證不丟資料. 存在的問題就是在消費完畢後, 維護 offset 時, 消費端掛掉了導致 offset 未更新, 下次重複消費.

所以關鍵在於如何控制重複消費.

一般有兩種考量:

第一種即消費端冪等消費:

比如資料要寫庫, 先根據主鍵查一下, 如果這資料都有了就 update; 還有根據資料庫表的唯一鍵進行約束.

比如你是寫 redis set, hbase 也沒有問題, 天然冪等性;

比如你不是上面兩個場景, 那做的稍微複雜一點, 你需要讓生產者傳送每條資料的時候, 裡面加乙個全域性唯一的 id, 先根據這個 id 去比如 redis 裡或 bloom filter 查一下, 之前消費過嗎? 如果沒有消費過, 你就處理, 然後這個 id 寫 redis. 如果消費過了就別處理了, 保證別重複處理相同的訊息即可.

如果這些都不行, 那只好將消費和維護 offset 進行事務繫結了, 比如 mysql. 當然還可以參考 flink 中通過兩階段提交實現 kafka flink 端到端的精準一次性, 或者直接上 structured streaming 唄.

但這些往往會犧牲效率, 如果重複資料不重要大可不必去重, 或者新增全域性唯一 id 下游通過 bloom filter 進行去重也可以的.

2樓:

很多人在這個問題上認識都是錯誤的, 目前看是全錯僅消費一次的難點是kafka和你要處理落地業務在兩套系統裡所以必須要事務的完成處理和提交這兩個操作(對於一些不能回滾的處理就要求處理完成必須落盤)

如果處理最終落盤的地方是支援事務的比如MySQL 那麼講offset和業務資料的更改一起寫到MySQL裡就可以保證只消費一次任何時候以MySQL offset為準尤其是故障恢復

只有這樣才具有故障恢復能力原因你可以自己想想

3樓:楊345

現有的kafka可以做到寫冪等性(0.11版本之後),但是做不到消費冪等性。就向您剛才說的,消費完後寫offset到zk失敗,這個狀態consumer客戶端是感知不到的,二者並沒有類似TCP的ack機制

因此下一次還是會從上次提交的offset繼續讀,就會出現重複消費。我個人覺得解決這個問題可以從兩個方向來考慮:

1.應用端做消費冪等性處理,也即每條訊息會有乙個全域性的key,應用端儲存消費過訊息的key,每次新消費一條資料,key做重複判斷,若重複,則丟棄這條資料。當然這會帶來額外的記憶體與查詢開銷。

2.服務端的設計,服務端會對每次消費提交的offset有個ack機制,通知consumer offset已經被儲存,若consumer 在超時時間內接收不到,則會繼續發起提交offset請求,直到接收到成功請求,才會進行下一次消費請求。這樣會明顯降低I/O吞吐量,現有的提交offset就非常類似於UDP,不會等待被確認,而改進之後類似於TCP。

同樣,應用端也就是consumer端需要訊息處理和offset提交這兩步是事務的,也即要麼操作成功要麼撤回恢復之前的狀態。這需要應用端有事務保障,但往往很多應用端是不支援事務的,比如kafka資料落盤hdfs,kafka資料消費完寫入本地檔案等等。但官方給的kafka consumer-process-kafka 給出了乙個不錯的參考的例子和思路。

基本上遵循了分布式系統中的兩階段提交想法和思路,具體可以參見http://

個人理解重複消費出現的概率並不會很高,在服務端改進會帶來很大的效能損耗,這可能是為什麼大家都選擇不處理的重要原因吧。另外,本身系統與系統之間傳輸資料,很難做到訊息的exactly once的。無論是kafka到儲存系統hdfs還是spark flink下游計算系統等。

若資料傳輸都在乙個系統之內,那相對好處理一些,比如kafka的事務,保證了consume-process-producer的事務場景,也就是從kafka消費處理完畢後再到kafka,這個可以做到exactly once。

個人理解,若有誤,請大家提出來,一起交流~

如何使用面霜?

我要變富婆 1 取用一些面霜,避免用手指直接挖去面霜,我們的手指上帶有細菌,直接挖取,容易造成面霜變質,然後用點塗法,將面霜點在臉頰 額頭 下巴和鼻尖處,如果是冬天使用,最好先將面霜放置手心捂熱後在使用,便於面霜更好吸收。2 然後將面霜從額頭中間向外抹開,輕輕按摩打圈按壓,幫助面霜吸收。3 額頭按摩...

眼霜如何使用?

變形金剛 亂塗眼霜老十歲!漂亮的小仙女來分享一下眼部除衰老心得嘍!眼睛就是乙個人的面部五官的核心,有一雙好看的眼睛整個人看起來都會精神很多。所以眼部護理真的很重要!特別是女生!大部分人每天都會很遲睡,所以眼袋黑眼圈就會很嚴重,而且眼睛周圍就會開始長皺紋,所以幾乎是每個女生都會必備的眼部抗衰老的眼霜了...

如何使用Anki

不是小強 2019.10.06 更新 電腦端的Anki軟體支援中文,iOS客戶端介面是英文的,安卓端沒有使用過。如果沒有英文基礎,可以先在電腦上使用Anki,另外有些複雜的操作在電腦上處理效率會高點,例如新增卡片 特別是批量新增 重置卡片進度等等。等到熟悉軟體操作後,像每天學習或者複習這樣簡單的動作...