StreamingQuery.awaitTermination 的目的是什么?

Him*_*dav 3 apache-spark spark-structured-streaming

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

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

StreamingQuery query = wordCounts.writeStream()
    .outputMode("complete")
    .format("console")
    .start();
query.awaitTermination();
Run Code Online (Sandbox Code Playgroud)

执行此代码后,流式计算将
在后台启动。查询对象是该活动
流查询的句柄,我们决定
使用 awaitTermination()等待查询终止,以防止进程
在查询处于活动状态时退出。

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

它到底是什么意思?它有助于避免查询写入的数据丢失。

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

我的代码看起来很简单:

dataset.writeStream()
  .option("startingOffsets", "earliest")
  .outputMode(OutputMode.Append())
  .format("console")
  .foreach(sink)
  .trigger(Trigger.ProcessingTime(triggerInterval))
  .option("checkpointLocation", checkpointLocation)
  .start();
Run Code Online (Sandbox Code Playgroud)

Jac*_*ski 10

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

我知道它在终止进程之前等待查询完成。它到底是什么意思?

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

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

阅读什么是 Java 中的守护线程?