关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
6年前关门了。
改进这个问题
我应该实现一个trident事务拓扑。我发现,我可以用Kafka作为喷口,使我的拓扑事务。我发现https://github.com/nathanmarz/storm-contrib/tree/master/storm-kafka 这是一个Kafka喷口风暴,但它不是交易。我也发现https://github.com/nathanmarz/storm/blob/master/storm-core/src/jvm/storm/trident/spout/iopaquepartitionedtridentspout.java 这是一个三叉戟Kafka交易喷口。但是我没有maven源代码,也没有使用它的说明。只有说明使用Kafka风暴喷口。我还需要一个实现分区Kafka指令。如果您有实现事务拓扑的经验,请帮助我!谢谢您!
1条答案
按热度按时间ve7v8dk21#
你看过这个Kafka喷口吗?
事务喷口不足以保证拓扑是事务性的。opaquetridentkafkaspout实现以下属性:
给定txid的批次始终相同。一个txid的批处理的重放将与该txid第一次发出批处理时的元组集完全相同。
元组的批之间没有重叠(元组在一个批或另一个批中,而不是多个)。
每个元组都在一个批中(不跳过任何元组)。
但是,如果您试图持久化某些计算,则必须实现事务状态,以便对每批元组执行一次数据库更新
要实现精确的一次处理,必须为计算保留批处理事务ID和以前的更新值。
让我们考虑一下文档中的示例:
您正在处理以下一批元组:[“man”][“man”][“dog”]与事务id“3”关联
然后在数据库中,您当前将一些字计数器作为键/值对:
man=>[count=3,txid=1];狗=>[count=4,txid=3];苹果=>[count=10,txid=2]
由于与键“dog”关联的txid与当前处理事务相同,因此可以跳过此更新。已为此事务更新元组“dog”。但其他元组不是这样的。更新数据库后,您的外观如下所示:
man=>[计数=5,txid=3];狗=>[count=4,txid=3];苹果=>[count=10,txid=2]
通过这种方式,trident能够比较事务id和以前的值来决定是否必须执行更新。
看看Map状态!
基本上,事务拓扑由事务喷口和事务状态组成。
您可以在此页面上找到有关三叉戟状态的更多信息:http://storm.incubator.apache.org/documentation/trident-state
我希望这对你有帮助。