使用spark 2.3构造流,并使用kafka作为输入流。 我的集群是由主人和3个工人组成的。 (主机在其中一台工作计算机上运行) 我的kafka主题有3个分区作为工作人员。 我正在使用默认触发器和foreach接收器来处理数据。
当第一条消息到达驱动程序时,它立即开始在一个可用的工作程序节点上开始处理数据,而在处理时,第二条消息到达,而不是立即在可用的工作程序上开始处理它,即“执行”。 ”的处理会延迟到第一个工作程序结束处理之前,现在所有“等待执行”的操作将在所有可用工作程序上并行开始。 (假设我有3条等待消息)
如何强制执行立即在等待的工作程序上执行?
**我的代码段:**
val sparkSession = SparkSession.builder().config(conf).getOrCreate()
import sparkSession.implicits._
import org.apache.spark.sql.ForeachWriter
val writer = new ForeachWriter[String] {
override def open(partitionId: Long, version: Long) = true
override def process(filePath: String) = {
val filesSeq = fileHandler
.handleData(filePath) // long processing
}
override def close(errorOrNull: Throwable) = {}
}
val filesDf = kafkaStreamSubscriber
.buildtream(conf, kafkaInputTopic)
val ds = filesDf.map(x=>x.getAs("filePath").asInstanceOf[String])
val query =
ds.writeStream
.foreach(writer)
.start
ds.writeStream
.format("console")
.option("truncate", "false")
.start()
println("lets go....")
query.awaitTermination()
我做错了什么?当我有等待处理的数据时,我不想有空闲的工作人员
感谢
答案 0 :(得分:0)
请参阅Spark Structured Streaming Triggers documentation section
据我了解,默认触发一次处理一个微批。如果您需要过程数据,我建议考虑使用Experimental Continuous模式。
我的理解是,如果您使用触发器(假设使用5秒),则微型批处理将从所有3个分区读取消息,并且您将同时运行3个任务。在它们全部完成之前,将不会开始任何微型批处理。
希望有帮助!