StreamingQuery.awaitTermination的目的是什么?

7

我有一个Spark Structured Streaming 作业,它从Kafka主题读取偏移量,并将其写入aerospike数据库。目前我正在将这个工作变得可生产并实现SparkListener

在阅读文档时,我偶然发现了这个例子:

StreamingQuery query = wordCounts.writeStream()
    .outputMode("complete")
    .format("console")
    .start();
query.awaitTermination();

After this code is executed, the streaming computation will have
started in the background. The query object is a handle to that active
streaming query, and we have decided to wait for the termination of
the query using awaitTermination() to prevent the process from exiting
while the query is active.

我知道它会在查询完成之前等待终止进程。

这准确地意味着什么?它有助于避免由查询编写的数据丢失。

当查询每天写入数百万条记录时,它如何帮助?

虽然我的代码看起来很简单:

dataset.writeStream()
  .option("startingOffsets", "earliest")
  .outputMode(OutputMode.Append())
  .format("console")
  .foreach(sink)
  .trigger(Trigger.ProcessingTime(triggerInterval))
  .option("checkpointLocation", checkpointLocation)
  .start();
2个回答

14

这里有很多问题,但只回答下面这一个就可以解决所有问题。

我知道它等待查询完成后才终止进程。这到底是什么意思?

流式查询在单独的守护线程中运行。在Java中,守护线程用于允许并行处理,直到您的Spark应用程序的主线程完成(死亡)。在最后一个非守护线程完成之后,JVM关闭并且整个Spark应用程序结束。

这就是为什么您需要使主要的非守护线程等待其他守护线程,以便它们可以完成它们的工作。

请阅读Java中的守护线程是什么? 以了解守护线程。


2
我明白它在终止进程之前等待查询完成。这到底是什么意思呢?
没有多余的解释,也没有少的部分。由于查询在后台启动,如果没有明确的阻塞指令,您的代码将简单地到达main函数的结尾并立即退出。
当查询每天写入数百万条记录时,它有何用处?
它实际上并没有帮助,而是确保查询得以执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接