spark无法通过新的groupId

时间:2015-07-31 21:27:59

标签: apache-spark apache-kafka

我正在使用spark streaming来读取来自Kafka的消息,它运行正常。但我有一个需要重新阅读消息的要求。我以为我可能只需要更改spark的customer groupId并重新启动spark streaming app,它应该从头开始重读kafka消息。但结果是Spark无法得到任何消息,我很困惑。通过Kafka文档,如果您更改了客户groupId,那么它应该从一开始就收到消息,因为kafka将您视为新客户。提前谢谢!

2 个答案:

答案 0 :(得分:2)

听起来你正在为Kafka使用spark streaming的基于接收器的api。对于那个api auto.offset.reset只适用于ZK中没有偏移的情况,正如您所注意到的那样。

http://spark.apache.org/docs/latest/streaming-kafka-integration.html#approach-2-direct-approach-no-receivers

如果您希望能够指定确切的偏移量,请参阅以fromOffsets作为参数的createDirectStream调用的版本。

答案 1 :(得分:1)

Kafka消费者有一个名为auto.offset.reset的属性(参见Kafka Doc)。这告诉消费者在开始消费时该做什么,但它还没有提交偏移量。这是你的情况。该主题有消息,但没有存储起始偏移量,因为您还没有读取该新组ID下的任何内容。在这种情况下,使用auto.offset.reset属性。如果该值为“最大”,并且这是默认值),则将起始位置设置为最大偏移量(最后一个),您将获得您所看到的行为。如果该值为“最小”,则将偏移量设置为起始偏移量,并且消费者将读取整个分区。这就是你想要的。

所以我不确定你是如何在你的Spark应用程序中设置Kafka属性的,但如果你想让新的组ID导致读取整个主题,你肯定希望将该属性设置为“最小” 。