簡體   English   中英

Storm KafkaSpout失敗的元組重復

[英]Storm KafkaSpout failed tuples duplicated

我正在使用storm-kafka-1.1.1-plus和storm 1.1.1。 使用BaseRichBolt,一個KafkaSpout和兩個螺栓A,Bolt B進行配置一旦螺栓B確認將其視為已成功處理的元組並將其提交,則將元組錨定在螺栓A中 但是,問題是由於某種原因,某些失敗的消息在KafkaSpout中被復制了

例如

KafkaSpout在處理它時發出了1000個元組,由於某種原因,有近20個元組失敗了(在B位置)。 那20個元組是連續重放的,在某個時候,工人被殺死了,主管重新啟動了該工人,然后又重放了這20個元組,這次它成功地處理了,但是處理了多次(重復)。

在此處輸入圖片說明

但是,我希望這些元組只能被處理一次(成功)。 我已將topology.enable.message.timeouts設置為false 我的另一個問題是,Storm將在哪里存儲那些失敗的Kafka偏移詳細信息 我沒有在Zookeeper上找到它,它只有以下細節。

{“ topology”:{“ id”:“ test_Topology-12-1508938595”,“ name”:“ test_Topology”},“ offset”:505,“ partition”:2,“ broker”:{“ host”:“ 127.0 .0.1“,”端口“:9092},”主題“:” test_topic_1“}

禁用消息超時可能會導致消息丟失,如果需要處理所有消息,則可能需要重新考慮禁用它。

啟用確認后,Storm會提供一次最少的處理保證。 您可能想看看是否可以使螺栓等冪,因此重播不會引起問題。 或者,您可以查看https://storm.apache.org/releases/1.1.1/Trident-tutorial.html ,它提供了一次精確的狀態更新。

編輯:您可能需要重新考慮您的問題。 據我所知,沒有任何流處理系統可以提供聽起來像您想要的那樣的一次精確處理。

Trident提供的精確語義是Trident將幫助您使狀態更新成為冪等,因此從您的數據存儲的角度來看,它看起來像消息僅被處理一次。 處理仍至少一次。 有關如何操作的直觀信息,請參見https://storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-state.html上的“事務處理噴嘴”一節(可能還有頁面的其余部分)。 基本思想是將有關已寫入消息的信息存儲在數據存儲中,這樣,如果重復這些消息,則狀態更新代碼可以忽略它們。

您可能還想閱讀https://streaml.io/blog/exactly-once 我想說的是Flink實現了類似於此處描述的分布式快照算法的方法,這是在最少一次系統中一次精確模擬的另一種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM