这个问题源于以下问题:
我想测试Spark结构化流[2.2.X或2.3.x]应用程序,该应用程序从Kafka读取其输入(没有from beginning
标志)。
该应用基本上是这样的:
val sparkSession = SparkSession.builder.getOrCreate()
val lines = sparkSession
.readStream
.format("kafka")
.option("kafka.bootstrap.servers","localhost:9092")
.option("subscribe", "test")
.load()
应用程序启动并运行后,可能需要花费任意时间才能开始收听Kafka主题。
如何在等待最短时间后将输入数据发布到Kafka?
问题的一个简单解决方案是在启动应用程序后等待大量任意时间:
startApplication()
Thread.sleep(10*1000)
postInputDataToKafka()
这对2个帐户有问题:
- 并非所有环境都相同,有些可能需要比预期更长的时间
- 这太浪费了
另一个选择是使用全局主管,这意味着要有一些协调测试的过程。
意思是,启动应用程序的相同进程等待接收来自它的信号,它已准备好收听。收到此信号后,它会开始发布输入数据。
这种方法要求应用程序发送这样的信号,我的问题是如何做到这一点。
答案 0 :(得分:1)
您可以等到StreamingQuery.lastProgress
返回非空值,例如
import org.apache.spark.sql.streaming.StreamingQuery
val q: StreamingQuery = ... // start a streaming query
while (q.lastProcess == null) {
Thread.sleep(100)
}
postInputDataToKafka