为什么kafka偏移量存储在应用程序的消费者端?

时间:2018-03-28 05:57:04

标签: apache-kafka

我们有一个kafka群集和火花流消费者。目前,偏移量存储在数据存储器的消费者侧。当最新的kafka(我们使用的)提供了在代理级别存储消费者偏移的功能(在kafka的Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(delegate { progressBar1.Value = progressBar1.Value + 1; //update in UI Thread return null; }), null); 主题上),在消费者端存储的原因是什么。

一个论点是,如果kafka集群出现故障,我们仍然会有偏移信息。但是如果kafka集群出现故障,即使消息丢失也无法为给定的偏移量重放消息。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

    1. 结构化流式传输
    2. 除了在检查点目录(例如HDFS)中存储偏移量之外,您没有其他选择。请参阅Structured Streaming + Kafka Integration Guide(Spark 2.2.x和2.3.0也是如此)。

答案 1 :(得分:2)

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

  

一个论点是,如果kafka集群出现故障,我们仍有偏差   信息。但是如果kafka集群出现故障,甚至消息都会丢失   并且对于给定的偏移量不能重放任何消息。

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

来自Cloudera的link非常好