是否可以在每次触发时,在聚合时间窗口结束前,输出聚合数据?
上下文。 我正在开发一个应用程序,从Kafka主题读取数据,处理数据,在一个小时的窗口内聚合数据,并输出到S3。 然而,Spark应用可以理解的是,只有在给定的一个小时窗口结束时,才会将聚合数据输出到S3。
问题是,S3中聚合数据的终端用户只能有一个半实时的视图,因为他们总是晚一个小时,等待下一个聚合从spark应用中输出。
将聚合时间窗口缩短到小于一个小时的时间,当然会有帮助,但会产生更多的数据。
有什么办法可以用最少的资源实现我所说的实时聚合?
这是一个很有意思的问题,我确实有一个建议,但我不知道这是否真的符合你的最低标准。我还是要描述一下解决方案......
如果最终的目标是让用户能够实时查询数据(或者换句话说是更快的分析),那么实现这个目标的一个方法就是在你的架构中引入一个能够处理快速插入updates的数据库--无论是键值存储还是面向列的数据库。下面是一张图,也许能帮助你把它可视化。
这个想法很简单--只需不断地将数据摄入第一个数据库,然后在一定时间后不断地将数据卸载到S3中,即根据你的要求,可以是一个小时或一天。然后,你可以将这两个存储层的元数据注册到元数据层中(如AWS Glue)--如果你不需要持久化的元存储,这可能并不总是必要的。除此之外,你可以使用像Presto这样的东西来查询这两个存储。这也能让你优化这2个数据存储的存储。
很明显,你需要建立一个流程,从你要流进的存储中删除数据分区,并将数据移动到S3。
这种模式被称为分层存储模式或具有滑动窗口模式的分层存储模式------。参考文章来自Cloudera.
希望能帮到你