Java Spark结构化流媒体中消费消息的跟踪
我想设置我的应用程序跟踪来自kafka的已消费消息的配置。因此,无论何时失败,它都可以从上次提交或消耗的偏移量开始拾取Java Spark结构化流媒体中消费消息的跟踪,java,apache-spark,apache-kafka,spark-structured-streaming,Java,Apache Spark,Apache Kafka,Spark Structured Streaming,我想设置我的应用程序跟踪来自kafka的已消费消息的配置。因此,无论何时失败,它都可以从上次提交或消耗的偏移量开始拾取 readStream .format("kafka") .option("kafka.bootstrap.servers", "host1:port1,host2:port2") .option("subscribe", "topic1") .load() .
readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "topic1")
.load()
.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("topic", "topic1")
.trigger(Trigger.Continuous("1 second")) // only change in query
.start();
我在网上读到,checkpointlocation
属性可以设置,spark可以使用它来跟踪偏移量
想知道在哪里可以设置此属性吗?我可以在选项中设置上述代码吗?我可以知道如何正确设置它吗
其次,我无法理解trigger(trigger.Continuous(“1秒”))
属性。Docs说,连续处理引擎将每秒记录查询的进度
,它在从kafka读取消息时会记录什么样的进度?您可以在writeStream中将检查点位置设置为一个选项
:
[...]
.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("topic", "topic1")
.option("checkpointLocation", "/path/to/dir")
.trigger(Trigger.Continuous("1 second"))
.start();
从Kafka读取时跟踪进度意味着跟踪TopicPartition中消耗的偏移量。设置检查点位置将使应用程序能够将该信息作为JSON对象存储在给定路径中,例如
{
"topic1":{
"0":11,
"1":101
}
}
这意味着应用程序已经使用了主题topic1
的分区0
中的偏移量10和分区1
中的偏移量100。检查点是“提前”写入的(使用提前写入日志),因此应用程序将继续从Kafka读取消息,在预期或非预期(失败)重新启动之前,该消息已停止
自Spark 2.3版起,就可以使用触发器.Continuous
。现在被标记为实验性的。与微批处理方法相比,它将在Kafka中的每一条消息到达主题后立即获取,而不尝试将其与其他消息一起批处理。这可以改善延迟,但很可能会降低总体吞吐量
参数(例如1秒
)确定检查点的频率
使用此触发模式时,重要的是至少要有与主题分区相同数量的可用内核。否则,应用程序将不会取得任何进展。您可以阅读更多关于它的信息:
例如,如果您正在阅读具有10个分区的Kafka主题,则群集必须至少具有10个核心,查询才能进行
是的,checkpointLocation被添加到选项中,但它需要一个与HDFS兼容的文件系统,如HDFS或S3。那么,您的意思是,一旦卡夫卡在故障后重新启动,它将从卡夫卡获取所有(已使用+新的)消息?它将继续在故障前停止的位置使用消息。有关已使用消息的信息将提前写入,并且仅在处理成功时提交。记住,结构化流媒体意义上的“提交”并不意味着提交回卡夫卡,而是提交到ist检查点位置。