Spark Streaming 重用物理计划

Posted

技术标签:

【中文标题】Spark Streaming 重用物理计划【英文标题】:Spark Streaming Re-Use Physical Plan 【发布时间】:2020-05-25 00:56:31 【问题描述】:

我们有一个 Spark Streaming 应用程序,它针对传入的数据流执行一些繁重的状态计算。在这里,状态在一些存储(HDFS/Hive/Hbase/Cassandra)中维护,并且在每个窗口结束时,状态的增量变化会使用 Append Only 写入策略更新回来。

问题在于,对于每个窗口,planning phase 都需要很长时间;实际上超过了计算时间。

    dStream.foreachRDD(rdd => 
        val dataset_1 = rdd.toDS()
        val dataset_2 = dataset_1.join(..)
        val dataset_3 = dataset_2
         .map(..)
         .filter(..)
         .join(..)

        // A few more Joins & Transformations

        val finalDataset = ..

        finalDataset
         .write
         .option("maxRecordsPerFile", 5000)
         .format(save_format)
         .mode("append")
         .insertInto("table_name")

    )

有没有办法重新使用上一个窗口中的物理计划,并避免 Spark 计划每个窗口的阶段,因为实际上窗口之间不会发生任何变化。

【问题讨论】:

【参考方案1】:

我不这么认为,这也是您应该改用Spark Structured Streaming 的众多原因之一。

底层流引擎的特性之一是重用流查询的物理计划。

【讨论】:

谢谢@JacekLaskowski !!这是否也意味着连接数据集的物理计划也将在结构化流中的多个窗口中仅分析一次。在这里,那些 Joined Dataset 不会被缓存,并且会在每个窗口上执行。 这是我的理解。批次之间的唯一变化是是否有来自任何来源的新输入。窗口化是负责加载相应状态的物理计划的一部分,它在物理操作符内部。

以上是关于Spark Streaming 重用物理计划的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL Query 中通过 Repartition 重用 Exchange

Spark Structured Streaming框架之进程管理

文末送书 | Spark Streaming 性能调优

Spark SQL与Hive的关系

spark-streaming任务提交遇到的坑

如何在 Spark Structured Streaming 中向 DataFrame 添加几列(仍未填充)