如何在Spark Kafka直接流中手动提交偏移量?

时间:2016-07-28 11:43:45

标签: apache-spark apache-kafka

我努力环顾四周,但没有找到满意的答案。也许我错过了什么。请帮忙。

我们有一个使用Kafka主题的Spark流应用程序,它需要在推进Kafka偏移之前确保端到端处理,例如:更新数据库。这非常类似于在流系统中构建事务支持,并保证每个消息都被处理(转换),更重要的是输出。

我读过有关Kafka DirectStreams的内容。它表示,对于DirectStreaming模式中的强大故障恢复,应启用Spark检查点,stores the offsets along with the checkpoints。但偏移管理是在内部完成的(设置Kafka config params,如["auto.offset.reset", "auto.commit.enable", "auto.offset.interval.ms"])。它没有提到我们如何(或者如果)我们可以自定义提交偏移(例如,一旦我们加载了数据库)。换句话说,我们可以将"auto.commit.enable"设置为false并自行管理偏移量(与数据库连接不同)吗?

非常感谢任何指导/帮助。

3 个答案:

答案 0 :(得分:1)

下面的文章可能是理解这种方法的良好开端。

spark-kafka-achieving-zero-data-loss

此外,

文章建议直接使用zookeeper客户端,也可以用KafkaSimpleConsumer替换。使用Zookeper / KafkaSimpleConsumer的优点是依赖于Zookeper保存的偏移量的监视工具。此外,信息也可以保存在HDFS或任何其他可靠的服务上。

答案 1 :(得分:0)

如果您检查日志,将会看到

2019-10-24 14:14:45 WARN  KafkaUtils:66 - overriding enable.auto.commit to false for executor
2019-10-24 14:14:45 WARN  KafkaUtils:66 - overriding auto.offset.reset to none for executor
2019-10-24 14:14:45 WARN  KafkaUtils:66 - overriding executor group.id to spark-executor-customer_pref_az_kafka_spout_stg_2
2019-10-24 14:14:45 WARN  KafkaUtils:66 - overriding receive.buffer.bytes to 65536 see KAFKA-3135

这些属性被Spark代码覆盖。

要手动提交,您可以关注spark文档

https://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html#kafka-itself

答案 2 :(得分:-1)

根据https://spark.apache.org/docs/2.2.0/streaming-kafka-0-10-integration.html#kafka-itself enable.auto.commit 必须设置为 false 和

stream.foreachRDD(rdd -> {
  OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();

  // some time later, after outputs have completed
  ((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
});