Trident kafka交易鲸鱼喷水

时间:2014-05-21 08:29:54

标签: maven transactions apache-storm transactional trident

我应该实现三叉戟事务拓扑。我发现我可以使用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的指令。如果您有实施事务拓扑的经验,请帮助我!谢谢!

1 个答案:

答案 0 :(得分:1)

你看过这个Kafka Spout吗?

事务性spout不足以保证拓扑是事务性的。 OpaqueTridentKafkaSpout实现以下属性:

  • 给定txid的批次始终相同。对txid进行批量重放将与第一次为该txid发出批次完全相同的元组集。
  • 元组批次之间没有重叠(元组是一个批次或另一个,永远不是多个)。
  • 每个元组都是批处理的(没有跳过元组)。

但是如果你试图坚持一些计算,那么你必须实现一个事务状态,以便对每批元组完全执行一次数据库更新

要实现一次性处理,您必须为计算保留批处理事务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

我希望这会对你有所帮助。

相关问题