我努力环顾四周,但没有找到满意的答案。也许我错过了什么。请帮忙。
我们有一个使用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并自行管理偏移量(与数据库连接不同)吗?
非常感谢任何指导/帮助。
答案 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);
});