Spark结构化流[2.2.x或2.3.x]应用程序如何表示它已准备好从Kafka主题中使用

时间:2018-03-07 16:12:22

标签: apache-spark apache-kafka spark-structured-streaming

构思问题

这个问题源于以下问题:

我想测试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个帐户有问题:
  - 并非所有环境都相同,有些可能需要比预期更长的时间   - 这太浪费了

复杂解决方案

另一个选择是使用全局主管,这意味着要有一些协调测试的过程。

意思是,启动应用程序的相同进程等待接收来自它的信号,它已准备好收听。收到此信号后,它会开始发布输入数据。

这种方法要求应用程序发送这样的信号,我的问题是如何做到这一点。

1 个答案:

答案 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