控制微型批次的结构化火花流

时间:2019-07-04 15:44:42

标签: scala azure apache-spark apache-kafka spark-structured-streaming

我正在从Kafka主题中读取数据,并将其以分区模式放入Azure ADLS(类似于HDFS)中。

我的代码如下:

val df = spark
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", bootstrapServers)
      .option("subscribe", topic)
      .option("failOnDataLoss", false)
      .load()
      .selectExpr(/*"CAST(key AS STRING)",*/ "CAST(value AS STRING)").as(Encoders.STRING)
df.writeStream
      .partitionBy("year", "month", "day", "hour", "minute")
      .format("parquet")
      .option("path", outputDirectory)
      .option("checkpointLocation", checkpointDirectory)
      .outputMode("append")
      .start()
      .awaitTermination()

我每秒大约有2000条记录,而我的问题是Spark每45秒插入一次数据,我希望立即插入数据。

有人知道如何控制微型批次的大小吗?

1 个答案:

答案 0 :(得分:2)

从Spark 2.3版本开始,可以使用连续处理模式。在官方文档中。您可以了解到,此模式仅支持三个接收器,只有Kafka接收器可以投入生产,并且“ 使用Kafka作为源和接收器,端到端低延迟处理可以得到最好的观察

df
.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("checkpointLocation", "/tmp/0")
.option("topic", "output0")
.trigger(Trigger.Continuous("0 seconds"))
.start()

因此,目前看来,您不能使用连续模式将HDFS用作接收器。就您而言,您可以测试Akka Streams和Alpakka connector