如何重置Kafka偏移以匹配尾部位置?

时间:2016-10-26 20:47:50

标签: java apache-kafka apache-storm apache-zookeeper

我们正在使用Storm与Kafka和ZooKeeper。我们有一种情况,我们不得不删除一些主题,并用不同的名称重新创建它们。除了从新主题名称中读取之外,我们的卡夫卡鲸鱼喷水保持不变。但是现在,当尝试从新主题中读取时,spouts正在使用旧主题分区的偏移量。因此,my-topic-name分区0的尾部位置将为500,但偏移量将为10000。

有没有办法重置偏移位置,使其与主题的尾部匹配?

1 个答案:

答案 0 :(得分:5)

有多个选项(因为Storm KafkaSpout没有提供任何API来定义起始偏移量。)

  1. 如果您希望从日志尾部使用消费者,则应删除旧的偏移量
    • 取决于你Kafka版本
      • (前0.9)你可以操纵ZK(这有点棘手)
      • (0.9+)或者您尝试删除主题__consumer_offsets的偏移量(这也很棘手,可能会删除您想要保留的其他偏移量)
    • 如果没有偏移,您可以使用自动偏移重置策略“最新”或“最大”重新启动您的喷口(取决于您的Kafka版本)
  2. 作为替代方案(我建议),您可以编写一个小型客户端应用程序,使用seek()以您需要的方式操纵偏移量并commit()偏移量。此客户端必须使用与KafkaSpout相同的组ID,并且必须订阅相同的主题。此外,您需要确保此客户端应用程序正在运行单个使用者组成员,以便分配所有分区。
    • 为此,您要么寻找到日志的末尾并提交
    • 或者您提交了无效的偏移量(如-1)并依赖自动偏移重置配置“最新”或“最大”(取决于您的Kafka版本)
  3. 对于Kafka Streams,有一个“应用程序重置工具”,可以执行类似的操作来处理已提交的偏移量。如果您想获得一些详细信息,可以阅读此博客文章http://www.confluent.io/blog/data-reprocessing-with-kafka-streams-resetting-a-streams-application/

    (免责声明:我是帖子的作者,它是关于Kafka Streams的 - 但是,基本的偏移操作思想是相同的)