正常停止结构化流式传输查询

时间:2017-08-16 15:21:19

标签: apache-spark spark-structured-streaming

我正在使用Spark 2.1并尝试优雅地停止Streaming查询。

StreamingQuery.stop()是否优雅,因为我在documentation中没有看到有关此方法的任何详细信息:

  

void stop()   如果正在运行,则停止执行此查询。   此方法将阻塞,直到执行执行的线程停止。   自:2.0.0

在过去的流媒体世界(DStreams)中,有option to stop个流的执行,可选择确保所有已接收的数据都已处理:

  

def stop(stopSparkContext: Boolean, stopGracefully: Boolean): Unit    停止执行流,并选择确保已处理所有接收的数据。

     

stopSparkContext   如果为true,则停止关联的SparkContext。无论是否这样,底层的SparkContext都将被停止   StreamingContext已经启动。

     

stopGracefully    如果为true,则等待处理完所有接收的数据,然后正常停止

所以问题是如何优雅地停止结构化流式传输查询?

4 个答案:

答案 0 :(得分:3)

StreamingQuery.stop 不会优雅地停止查询,它会调用 sparkContext.cancelJobGroup(all jobs generated by streaming query)

所以为了避免它,并等待当前批处理完成,我使用 https://gist.github.com/GrigorievNick/bf920e32f70cb1cf8308cd601e415d12 请注意,它仅适用于 MicroBatchExectuion

答案 1 :(得分:2)

这取决于什么意思"优雅" :)

StreamingQuery仅停止特定查询。它等待,直到MicroBatch线程停止并准备关闭源。这"等待"表示将处理数据,然后线程将停止

答案 2 :(得分:1)

如果通过"优雅地"你的意思是流式查询应该完成数据处理,然后void stop()将不会这样做。它将等待执行执行的线程停止(如文档中所述)。这并不意味着它将完成处理。

为此,我们需要使查询等待,直到查询的当前触发器完成。我们可以通过StreamingQueryStatus查看,如下所示:

  

while(query.status.isTriggerActive){//什么都不做}

它会等到查询完成处理。然后我们可以致电query.stop()

我希望它有所帮助!

答案 3 :(得分:0)

如果没有更多记录可供使用,则此类代码可以帮助停止微批处理流

def stopStreamQuery(query: StreamingQuery, awaitTerminationTimeMs: Long) {
   while (query.isActive) {
      val msg = query.status.message
      if (!query.status.isDataAvailable
          && !query.status.isTriggerActive
             && !msg.equals("Initializing sources")) {
      query.stop()
    }
    query.awaitTermination(awaitTerminationTimeMs)
  }
}