Apache spark Spark structured streaming在不同工作节点上的每一行排列后立即对其进行处理
使用spark 2.3 Structed streaming和kafka作为输入流。 我的集群是由master和3个worker构建的。(其中一台工作机器上的主运行) 我的卡夫卡主题有3个分区作为工作区的数目。 我使用默认触发器和foreach接收器来处理数据 当第一条消息到达驱动程序时,它立即开始在一个可用工作节点上处理数据,在处理过程中,第二条消息到达,而不是立即在可用工作节点上开始处理,处理的“执行”被延迟,直到第一个工作节点结束处理,现在,所有“等待执行”开始在所有可用的工作线程上并行处理。(假设我有3条等待消息) 如何强制等待的工作人员立即开始执行 **我的代码片段:**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接收器来处理数据 当第一条消息到达驱动程序时,它立即开始在一个可用工作节点上处理数据,在处理过程中,第二条消息到达,而不是立即在可用工作节点上开始处理,处理的“执行”被延迟,直到第一个工作节点结束处理,现在,所有“等待执行”开始在所有可用的工作线程上并行处
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。