Apache spark 终止后如何获取流式查询的进度?

Apache spark 终止后如何获取流式查询的进度?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我是spark的新手,读了一些关于监视spark应用程序的文章。基本上,我想知道spark应用程序在给定的触发时间和查询进程中处理了多少条记录。我知道“lastProgress”给出了所有这些指标,但当我使用“lastProgress”时,它总是返回null val q4s = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", brokers) .option("subscribe", topi

我是spark的新手,读了一些关于监视spark应用程序的文章。基本上,我想知道spark应用程序在给定的触发时间和查询进程中处理了多少条记录。我知道“lastProgress”给出了所有这些指标,但当我使用“lastProgress”时,它总是返回null

 val q4s = spark.readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", brokers)
  .option("subscribe", topic)
  .option("startingOffsets", "earliest")
  .load()
  .writeStream
  .outputMode("append")
  .option("checkpointLocation", checkpoint_loc)
  .trigger(Trigger.ProcessingTime("10 seconds"))
  .format("console")
  .start()

  println("Query Id: "+ q4s.id.toString())
  println("QUERY PROGRESS.........")
println(q4s.lastProgress);
q4s.awaitTermination();
输出:

Query Id: efd6bc15-f10c-4938-a1aa-c81fdb2b33e3
QUERY PROGRESS.........
null
如何在使用awaitTermination时获得查询进度,或者如何在不使用awaitTermination的情况下保持查询持续运行


提前感谢。

您必须启动一个单独的线程,引用要监视的流式查询(例如
q4s
),并定期提取进度

启动查询的线程(Spark Structured Streaming应用程序的主线程)通常是
等待终止
,因此它启动的流式查询的守护进程线程可以继续运行。

使用专用的可运行线程 您可以创建一个专用线程,连续打印流式查询的最后进度

首先,定义一个可运行的监视类,它每10秒(10000ms)打印一次最后的进度:

class StreamingMonitor(q:StreamingQuery)扩展了Runnable{
def运行{
while(true){
println(“时间:+Calendar.getInstance().getTime())
println(q.lastProgress)
线程。睡眠(10000)
}
}
}
第二,将其实现到应用程序代码中,如下所示:

val q4s: StreamingQuery = df.writeStream
  [...]
  .start()

new Thread(new StreamingMonitor(q4s)).start()

q4s.awaitTermination()
循环查询状态 您还可以对查询的状态进行while循环:

val q4s:StreamingQuery=df.writeStream
[...]
.start()
而(第四季度为活动期){
println(第四季度最新进展)
线程。睡眠(10000)
}
q4s.终止协议()
使用StreamingQueryListener的替代解决方案 监视流式查询的另一种解决方案是使用
StreamingQueryListener
。同样,首先定义一个扩展
StreamingQueryListener
的类:

import org.apache.spark.sql.streaming.{StreamingQueryListener,StreamingQueryProgress}
导入org.apache.spark.sql.streaming.StreamingQueryListener.QueryProgressent
类MonitorListener扩展StreamingQueryListener{
override def onQueryStarted(事件:StreamingQueryListener.QueryStartedEvent):单位={}
覆盖def onQueryProgress(事件:QueryProgressent):单位={
println(s“”“numInputRows:${event.progress.numInputRows}>”)
println(s“”“processedRowsPerSecond:${event.progress.processedRowsPerSecond}”)
}
重写定义onQueryTerminated(事件:StreamingQueryListener.QueryTerminatedEvent):单位={}
}
然后将其注册到您的SparkSession:

spark.streams.addListener(新的MonitorListener)

谢谢Jacek!我花了几个小时试图实现你的建议,但没能实现。你能指出一个类似的链接吗?再次感谢!我会从