【问题标题】:why kafka offsets are stored at consumer end of application?为什么kafka偏移量存储在应用程序的消费者端?
【发布时间】:2018-03-28 19:05:19
【问题描述】:

我们有一个 kafka 集群和 spark-streaming 消费者。目前,偏移量存储在数据存储的消费者端。当我们使用的最新 kafka 提供了在代理级别存储消费者偏移量的功能时(在 kafka 中的 _consumer_offset 主题上),在消费者端存储的原因是什么。

一个论点是,如果 kafka 集群出现故障,我们仍然有偏移信息。但是如果 kafka 集群宕机了,即使是消息也会丢失,并且对于给定的偏移量,没有消息可以重播。

我遗漏了一些明显的东西,但无法弄清楚。 谢谢

【问题讨论】:

  • 不同的消费者可能有不同的偏移量。为什么服务器要无限期地存储所有可能客户端的偏移量?如果你想在 Zookeeper 中单独备份你的偏移量,你可以这样做。
  • 它存储了一个(consumer_group, topic, offset)的元组

标签: apache-kafka


【解决方案1】:

据我了解,您要回答的核心问题是

一个论点是,如果 kafka 集群出现故障,我们仍然有偏移量 信息。但是如果kafka集群宕机了,连消息都会丢失 并且对于给定的偏移量,无法重播任何消息。

通过在外部存储偏移范围,它允许 Spark Streaming 应用程序能够从任何时间点重新启动和重播消息,只要消息在 Kafka 中仍然存在。因此,在外部存储偏移量的决定可能不仅仅是基于恢复场景,而是一个普遍的场景。

这个来自Cloudera的link非常好

【讨论】:

  • 即使在 spark 从偏移量重播消息的情况下,也可以从 kafka 本身而不是外部数据存储中偏移。我相信 kafka 中的 __consumer_offset 主题可用于此目的。
【解决方案2】:

正如Spark Streaming + Kafka Integration Guide 中提到的,您存储提交偏移量的方式取决于您的可靠性要求有多严格。

根据您使用的流式 API,您可能有几个选项。

  1. DStream

第一个也是最简单的一个选项是配置外部检查点位置以存储您的数据和消费者偏移量。它允许您在出错后轻松恢复您的 spark 代码,并产生幂等输出(当您将数据写入文件时很方便)。使用 DStream 时,应禁用 enable.auto.commit

您也可以手动向 Kafka 或您的存储提交偏移量(参见上面链接中的示例)。在这种情况下,有责任使您的输出具有幂等性。

  1. 结构化流

除了在检查点目录(例如 HDFS)中存储偏移量之外,您别无选择。请参阅Structured Streaming + Kafka Integration Guide(Spark 2.2.x 和 2.3.0 相同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2016-03-05
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多