Spark结构化流:将流与应该在每个微型批次中读取的数据结合起来

时间:2018-07-19 19:11:25

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

我有一个来自HDFS的流,我需要将它与同样包含在HDFS中的元数据(两个木地板)一起加入。

我的元数据有时会更新,我需要加入最新的内容,这意味着理想情况下,每个流微批次都从HDFS读取元数据。

我试图对此进行测试,但是不幸的是,即使我尝试使用spark.sql.parquet.cacheMetadata=false,Spark也会在缓存了文件(假定是)之后读取元数据。

有没有一种方法可以读取每个微型批次?不是我要找的Foreach Writer?

以下代码示例:

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

spark.sql("SET spark.sql.parquet.cacheMetadata=false")

val stream = spark.readStream.parquet("/tmp/streaming/")

val metadata = spark.read.parquet("/tmp/metadata/")

val joinedStream = stream.join(metadata, Seq("id"))

joinedStream.writeStream.option("checkpointLocation", "/tmp/streaming-test/checkpoint").format("console").start()



/tmp/metadata/ got updated with spark append mode.

据我了解,通过JDBC jdbc source and spark structured streaming访问元数据时,Spark将查询每个微型批次。

1 个答案:

答案 0 :(得分:0)

据我发现,有两种选择:

  1. 创建临时视图并使用间隔刷新它:

    metadata.createOrReplaceTempView(“ metadata”)

并在单独的线程中触发刷新:

<service_name>.<stack_name>

注意:在这种情况下,spark只会读取相同的路径,如果您需要从HDFS上的其他文件夹中读取元数据,例如Spark带有时间戳等。

  1. 重新启动间隔为Tathagata Das suggested的流

这种方式不适合我,因为我的元数据可能每小时刷新几次。