Apache spark Spark结构化流媒体-无需重新读取数据的多个聚合

Apache spark Spark结构化流媒体-无需重新读取数据的多个聚合,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我正在研究将ApacheSpark用于一个应用程序。我对使用临时视图和完整SQL查询的结构化流模式特别感兴趣(为了简单和低延迟) 应用程序需要在单个输入数据流上运行多个(数十个,可能数百个)查询。有没有办法避免Spark重新读取每个查询的输入?同一Spark结构化流媒体应用程序中的多个流媒体查询将同时独立运行,因为它们在读取同一源时会取得不同的进展。因此,缓存/持久化是不可行的(实际上是不可能的) 除非对流式查询使用以下foreachBatch模式,否则没有标准的方法来缓存输入源 streami

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


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

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

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

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

有关详细信息,请参见《结构化流媒体编程指南》(Structured Streaming Programming Guide on

OK),但如果我理解正确,在foreachBatch示例中,您只能访问当前微批次中的数据。因此,如果我在进行聚合,我必须手动维护每个聚合的当前状态?是的,您的理解是正确的。似乎我正在失去使用forEachBatch进行结构化流式处理的许多好处。然而,这似乎是一个非常常见的用例。Spark不适合吗?或者在现实世界的应用程序中是否有其他方法可以缓解这种情况(输入来自缓存文件系统等)?我不相信在单个结构化流应用程序中运行数百个查询是一种常见的用例。至少,根据我到目前为止的经验,这个问题还不清楚。如果组密钥相同,“单个”流式查询中的多个聚合应该是可能的。(只需在“agg()”中添加所有聚合)如果您谈论的是任意类型的聚合,例如不同的组键,很抱歉,它们应该是单独的流式查询,输入应该被重新读取。解决方法是下面麦克风的答案。Spark中不存在分叉/分割流的概念,而存在其他流框架;所以你的下一个赌注将是试用Flink来检查你的要求是否得到满足。