Spark结构化的流接收器到输出的延迟

时间:2019-07-10 14:01:16

标签: apache-spark apache-spark-sql spark-streaming

下面的Spark结构化流代码每10秒从Kafka收集一次数据:

window($"timestamp", "10 seconds")

我期望每10秒将结果打印在控制台上一次。但是,我注意到每隔约2分钟或以上的时间就会向控制台下沉。 我可以知道我在做什么错吗?

def streaming(): Unit = {
    System.setProperty("hadoop.home.dir", "/Documents/ ")
    val conf: SparkConf = new SparkConf().setAppName("Histogram").setMaster("local[8]")
    conf.set("spark.eventLog.enabled", "false");
    val sc: SparkContext = new SparkContext(conf)
    val sqlcontext = new SQLContext(sc)
    val spark = SparkSession.builder().config(conf).getOrCreate()

    import sqlcontext.implicits._
    import org.apache.spark.sql.functions.window

    val inputDf = spark.readStream.format("kafka")
      .option("kafka.bootstrap.servers", "localhost:9092")
      .option("subscribe", "wonderful")
      .option("startingOffsets", "latest")
      .load()
    import scala.concurrent.duration._

    val personJsonDf = inputDf.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)", "timestamp")
      .withWatermark("timestamp", "500 milliseconds")
      .groupBy(
    window($"timestamp", "10 seconds")).count()

    val consoleOutput = personJsonDf.writeStream
      .outputMode("complete")
      .format("console")
      .option("truncate", "false")
      .outputMode(OutputMode.Update())
      .start()
    consoleOutput.awaitTermination()
  }

object SparkExecutor {
  val spE: SparkExecutor = new SparkExecutor();
  def main(args: Array[String]): Unit = {
    println("test")
    spE.streaming
  }
}

1 个答案:

答案 0 :(得分:0)

我认为您可能在personJsonDf操作期间缺少用于查询writeStream的触发器定义。默认为2分钟(不确定)。

您已定义的groupBy窗口将在查询中使用,但不会定义其周期性。

一种配置方式可能是:

val consoleOutput = personJsonDf.writeStream
  .outputMode("complete")
  .trigger(Trigger.ProcessingTime("10 seconds"))
  .format("console")
  .option("truncate", "false")
  .outputMode(OutputMode.Update())
  .start()

最后,类Trigger包含一些您想检出的有用方法。

希望有帮助。