我应该实现三叉戟事务拓扑。我发现我可以使用kafka作为spout来使我的拓扑成为事务性的。我发现https://github.com/nathanmarz/storm-contrib/tree/master/storm-kafka它是风暴的卡夫卡鲸鱼喷水,但它不是交易性的。我还发现https://github.com/nathanmarz/storm/blob/master/storm-core/src/jvm/storm/trident/spout/IOpaquePartitionedTridentSpout.java这是一个三叉戟kafka交易鲸鱼喷水。但我没有maven源代码,也没有使用它的说明。只有使用卡夫卡风暴喷口的说明。我还需要一个实现分区kafka的指令。如果您有实施事务拓扑的经验,请帮助我!谢谢!
答案 0 :(得分:1)
事务性spout不足以保证拓扑是事务性的。 OpaqueTridentKafkaSpout实现以下属性:
但是如果你试图坚持一些计算,那么你必须实现一个事务状态,以便对每批元组完全执行一次数据库更新
要实现一次性处理,您必须为计算保留批处理事务ID和以前的更新值。
让我们考虑documentation:
中的示例您正在处理以下一批元组:[“man”] [“man”] [“dog”]与交易ID“3”相关联
然后在您的数据库中,您当前将一些单词计数器作为键/值对:
man => [count = 3,txid = 1]; dog => [count = 4,txid = 3]; apple => [count = 10,txid = 2]
由于与键“dog”关联的txid与当前处理事务相同,因此您可以跳过此更新。元组“dog”已经针对此事务进行了更新。但事实并非其他元组的情况。更新后,您的数据库如下所示:
man => [count = 5,txid = 3]; dog => [count = 4,txid = 3]; apple => [count = 10,txid = 2]
通过这种方式,Trident能够比较事务ID和先前的值来决定是否必须执行更新。
看看Map State!
基本上,事务性拓扑由事务性spout和事务状态组成。
您可以在此页面上找到有关三叉戟状态的更多信息: http://storm.incubator.apache.org/documentation/Trident-state
我希望这会对你有所帮助。