Apache spark 终止后如何获取流式查询的进度?
我是spark的新手,读了一些关于监视spark应用程序的文章。基本上,我想知道spark应用程序在给定的触发时间和查询进程中处理了多少条记录。我知道“lastProgress”给出了所有这些指标,但当我使用“lastProgress”时,它总是返回nullApache 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
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!我花了几个小时试图实现你的建议,但没能实现。你能指出一个类似的链接吗?再次感谢!我会从