我有一个Spark结构化流作业,它从Kafka主题读取偏移量并将其写入Aerospike数据库。目前,我正在准备这份工作,并实施SparkListener
。
在浏览文档时,我偶然发现了以下示例:
StreamingQuery query = wordCounts.writeStream()
.outputMode("complete")
.format("console")
.start();
query.awaitTermination();
执行此代码后,流计算将具有 在后台开始。查询对象是该活动对象的句柄 流查询,我们决定等待终止 使用awaitTermination()进行查询以防止进程退出 查询处于活动状态时。
我知道它在终止过程之前会等待查询完成。
到底是什么意思?它有助于避免查询写入的数据丢失。
当查询每天写入数百万条记录时,这有什么帮助?
我的代码看起来很简单:
dataset
.writeStream()
.option("startingOffsets", "earliest")
.outputMode(OutputMode.Append())
.format("console")
.foreach(sink)
.trigger(Trigger.ProcessingTime(triggerInterval))
.option("checkpointLocation", checkpointLocation)
.start();
答案 0 :(得分:2)
我知道它在终止过程之前会等待查询完成。 到底是什么意思
仅此而已。由于查询是在后台启动的,因此无需显式的阻塞指令,您的代码将仅到达main
函数的结尾并立即退出。
当查询每天写入数百万条记录时,这有什么帮助?
实际上不是。相反,它确保查询完全执行。
答案 1 :(得分:2)
这里有很多问题,但仅回答以下一个问题即可。
我知道它在终止过程之前会等待查询完成。到底是什么意思?
流查询在单独的守护程序线程中运行。在Java中,守护程序线程用于允许并行处理,直到Spark应用程序的主线程完成( dies )为止。在最后一个非守护程序线程完成后,JVM关闭,整个Spark应用程序也完成了。
这就是为什么您需要让非守护程序主线程等待其他守护程序线程,以便它们可以完成工作。
在What is a daemon thread in Java?中阅读守护进程线程