Spark结构化流文件源开始偏移

时间:2018-07-18 00:00:13

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

有没有一种方法可以指定Spark结构化文件流源的起始偏移量?

我正在尝试从HDFS流式传输实木地板:

spark.sql("SET spark.sql.streaming.schemaInference=true")

spark.readStream
  .parquet("/tmp/streaming/")
  .writeStream
  .option("checkpointLocation", "/tmp/streaming-test/checkpoint")
  .format("parquet")
  .option("path", "/tmp/parquet-sink")
  .trigger(Trigger.ProcessingTime(1.minutes))
  .start()

如我所见,第一个运行是处理路径中检测到的所有可用文件,然后将偏移量保存到检查点位置并仅处理新文件,即接受使用期限且在映射文件中不存在的新文件。

我正在寻找一种方法,如何指定起始偏移量或时间戳或选项数量,以在首次运行时不处理所有可用文件。

有没有寻找的方法?

2 个答案:

答案 0 :(得分:2)

感谢@jayfah,据我所知,我们可以使用以下技巧来模拟Kafka“最新的”起始偏移量:

  1. 使用option("latestFirst", true)option("maxFilesPerTrigger", "1")通过检查点,虚拟接收器和大量处理时间来运行警告流。这样,热身流会将最新的文件时间戳保存到检查点。

  2. 使用相同的检查点位置的option("maxFileAge", "0")(真实接收器)运行真实流。在这种情况下,流将仅处理新近可用的文件。

大部分可能不是生产所必需的,并且有更好的方法,例如重新整理数据路径等,但是至少我以此方式找到了问题的答案。

答案 1 :(得分:0)

FileStreamSource不能指定起始偏移量。

但是您可以将latestFirst的选项设置为true,以确保它首先处理最新文件(默认情况下,此选项为false)

https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#input-sources

 spark.readStream
  .option("latestFirst", true)
  .parquet("/tmp/streaming/")
  .writeStream
  .option("checkpointLocation", "/tmp/streaming-test/checkpoint")
  .format("parquet")
  .option("path", "/tmp/parquet-sink")
  .trigger(Trigger.ProcessingTime(1.minutes))
  .start()