【问题标题】:Spark Structured Streaming - multiple aggregations without re-reading dataSpark Structured Streaming - 无需重新读取数据的多个聚合
【发布时间】:2021-04-24 00:20:56
【问题描述】:

我正在研究将 Apache Spark 用于应用程序。我对使用临时视图和完整 SQL 查询(为了简单和低延迟)的结构化流模式特别感兴趣。

该应用程序需要对单个输入数据流运行多个(数十个,可能数百个)查询。有没有办法避免 Spark 重新读取每个查询的输入?

【问题讨论】:

  • 问题不清楚。 “如果组键相同”,“单个”流式查询中的多个聚合应该是可能的。 (只需在“agg()”中添加所有聚合。)如果您正在谈论任意类型的聚合,例如不同的组键,对不起,它们应该是单独的流查询,并且应该重新读取输入。解决方法是下面迈克的回答。 Spark中不存在分叉/拆分流的概念,而其他流框架存在;所以你的下一个赌注是尝试 Flink 来检查你的要求是否得到满足。

标签: apache-spark spark-structured-streaming


【解决方案1】:

同一个 Spark Structured Streaming 应用程序中的多个流式查询将同时独立运行,因为它们在读取同一源时会取得不同的进度。因此,缓存/持久化将不可行(实际上是不可能的)。

除非您对流式查询使用以下foreachBatch 模式,否则没有标准方法可以缓存输入源。

streamingDF.writeStream.foreachBatch { (batchDF: DataFrame, batchId: Long) =>
  batchDF.persist()
  batchDF.write.format(...).save(...)  // location 1
  batchDF.write.format(...).save(...)  // location 2
  batchDF.unpersist()
}

更多细节在结构化流编程指南using foreach and foreachbatch

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2021-12-05
    • 2017-04-25
    • 2019-10-18
    相关资源
    最近更新 更多