Kafka抵消了Zookeeper的持久性

时间:2016-04-27 22:26:02

标签: apache-kafka apache-storm

我是Storm / Kafka的新手。 我已经能够配置一个基本的工作原型:

  • zookeeper 3.4.5
  • kafka 2.11-0.9.0.1
  • storm 1.0.0(实际上是作为嵌入式java LocalCluster)
  • 风暴卡夫卡-1.0.0

我能够生成消息并从风暴拓扑中消耗它们。

我有一个关于kafka抵消持续存在的问题。

最初,当使用kafka实用程序时,我无法找到java客户端中使用的组。

经过一番搜索后,我读到了风暴卡夫卡在动物园管理员处存放这个偏移量。 如果我在storm-kafka中进行配置:

  • zkroot =“/ my_root”
  • group.id =“my_group”

然后我可以使用zookeeper zkCli.sh脚本检索偏移量。

get /my_root/my_group/partition_0
==> "topology":{},"offset":3148,..., "topic":"rawdatas"

我的问题是我不明白这种偏移的更新方式和频率。 在暴风雨中,我肯定会处理每一个元组。

当拓扑开始,并且元组开始被处理时,我可以在Zookeeper中看到一点偏移(例如:几十个) 然后偏移量不会长时间移动。

有一段时间,我可以看到一个更大的跳跃(例如几千),但它似乎是随机的。 关于默认的kafka配置,我知道偏移应该每2秒更新一次

// setting for how often to save the current kafka offset to ZooKeeper
public long stateUpdateIntervalMs = 2000;

我错过了什么吗?

弗兰克

1 个答案:

答案 0 :(得分:1)

在kafka-spout代码中潜水后,我更了解我的问题。

这篇文章对我也有帮助: http://www.developer.com/open/addressing-internal-apache-storm-buffers-overflowing.html

像往常一样,一切都是配置问题

在我的示例拓扑中,我有一个kafka-spout,它将一个元组发送到一个简单的单线螺栓上,这个螺栓可以进行强烈的计算"我们可以用一个简单的Thread.sleep(1000)来模拟

Storm有一个限制,即在拓扑中可以释放多少个元组(默认为512) 喷口喷口和元组的最终确认之间也有一个超时,默认为30秒。

我认为重要的是:

  1. 在toplolgy开始时,前面的512个元组被发射并开始 由螺栓处理。
  2. 在~30秒后,spout开始在某些元组上收到fail() 由于超时。这些元组被添加到另一个风暴队列中 重放。
  3. 默认重播策略意味着需要进行大量重播。
  4. 在尝试重放元组的所有时间内,A 优秀的抵消不能在zookeeper中提交。这就是我无法做到的原因 看这个偏差evoluate。
  5. 一段时间后,重放队列使堆和网络饱和 进程挂起。
  6. 在我的情况下,我只需调整maxSpoutPending和MessageTimeOutSet以在拓扑中获得良好的流动

    StormTopology topology = builder.createTopology();
    conf.setMaxSpoutPending(50);
    conf.setMessageTimeoutSecs(120);
    

    弗兰克