Apache spark Spark structured streaming在不同工作节点上的每一行排列后立即对其进行处理

Apache spark Spark structured streaming在不同工作节点上的每一行排列后立即对其进行处理,apache-spark,apache-kafka,apache-spark-sql,spark-structured-streaming,apache-spark-standalone,Apache Spark,Apache Kafka,Apache Spark Sql,Spark Structured Streaming,Apache Spark Standalone,使用spark 2.3 Structed streaming和kafka作为输入流。 我的集群是由master和3个worker构建的。(其中一台工作机器上的主运行) 我的卡夫卡主题有3个分区作为工作区的数目。 我使用默认触发器和foreach接收器来处理数据 当第一条消息到达驱动程序时,它立即开始在一个可用工作节点上处理数据,在处理过程中,第二条消息到达,而不是立即在可用工作节点上开始处理,处理的“执行”被延迟,直到第一个工作节点结束处理,现在,所有“等待执行”开始在所有可用的工作线程上并行处

使用spark 2.3 Structed streaming和kafka作为输入流。 我的集群是由master和3个worker构建的。(其中一台工作机器上的主运行) 我的卡夫卡主题有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()
我做错了什么?当我有等待处理的数据时,我不希望有空闲的工作人员

Thanx参见

据我所知,默认触发器一次处理一个微批次。如果你需要一个过程数据,我建议你考虑一下。 我的理解是,如果您在5秒钟内使用触发器,微批处理将从所有3个分区读取消息,您将有3个任务同时运行。在它们全部完成之前,将不会启动微批次


希望有帮助

谢谢@Mikhail,但是,请参阅“如果上一个微批处理的完成时间长于间隔,那么下一个微批处理将在上一个微批处理完成后立即开始”但我的集群上仍然有可用资源,我正在寻找更像消息驱动事件的行为,当消息到达时,如果有可用的执行器,它将尽快开始处理。一般来说,Spark主要基于微批处理,您可以尝试实验性连续模式或其他事件驱动框架,如Storm。