有没有一种方法可以指定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()
如我所见,第一个运行是处理路径中检测到的所有可用文件,然后将偏移量保存到检查点位置并仅处理新文件,即接受使用期限且在映射文件中不存在的新文件。
我正在寻找一种方法,如何指定起始偏移量或时间戳或选项数量,以在首次运行时不处理所有可用文件。
有没有寻找的方法?
答案 0 :(得分:2)
感谢@jayfah,据我所知,我们可以使用以下技巧来模拟Kafka“最新的”起始偏移量:
使用option("latestFirst", true)
和option("maxFilesPerTrigger", "1")
通过检查点,虚拟接收器和大量处理时间来运行警告流。这样,热身流会将最新的文件时间戳保存到检查点。
使用相同的检查点位置的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()