一旦触发,Spark结构化流处理就会在不同的工作程序节点上的每一行进行处理

时间:2018-08-15 12:57:21

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

使用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()

我做错了什么?当我有等待处理的数据时,我不想有空闲的工作人员

感谢

1 个答案:

答案 0 :(得分:0)

请参阅Spark Structured Streaming Triggers documentation section

据我了解,默认触发一次处理一个微批。如果您需要过程数据,我建议考虑使用Experimental Continuous模式。

我的理解是,如果您使用触发器(假设使用5秒),则微型批处理将从所有3个分区读取消息,并且您将同时运行3个任务。在它们全部完成之前,将不会开始任何微型批处理。

希望有帮助!