首页 > 解决方案 > Spark结构化流式实时聚合

问题描述

在聚合时间窗口结束之前,是否可以在每个触发器上输出聚合数据?

上下文:我正在开发一个应用程序,它从 Kafka 主题读取数据、处理数据、在 1 小时的窗口内聚合数据,然后输出到 S3。但是,可以理解的是,Spark 应用程序仅在给定小时窗口结束时才将聚合数据输出到 S3。

问题是 S3 中聚合数据的最终用户只能有一个半实时的视图,因为他们总是迟到一个小时,等待从 spark 应用程序输出下一个聚合。

将聚合时间窗口减少到小于一小时肯定会有所帮助,但会产生更多数据。

可以做些什么来使用最少的资源实现实时聚合?

标签: apache-sparkspark-structured-streaming

解决方案


这是一个有趣的建议,我确实有一个建议,但我不确定这是否真的符合您的最低标准。无论如何,我将描述解决方案...

如果最终目标是让用户能够实时查询数据(或者换句话说,更快的分析),那么实现这一目标的一种方法是在您的架构中引入一个可以处理快速插入/更新的数据库 - 要么是键值存储或面向列的数据库。下面是一个图表,可以帮助您可视化这一点:

在此处输入图像描述

这个想法很简单 - 只需继续将数据摄取到第一个数据库中,然后在特定时间(即一小时或一天)后继续将数据卸载到 S3,具体取决于您的要求。然后,您可以将这两个存储层的元数据注册到元数据层(例如 AWS Glue)中 - 如果您不需要持久元存储,这可能并不总是必要的。最重要的是,您可以使用 Presto 之类的东西来查询这两个商店。这也将使您能够跨这两个数据存储优化您的存储。

您显然需要构建流程以从您将流式传输到的存储中删除/删除数据分区,并将数据移动到 S3。

该模型被称为分层存储模型或具有滑动窗口模式的分层存储模型 - Cloudera 的参考文章

希望这可以帮助!


推荐阅读