我有一个流式数据框架,我想计算一些每日的计数器,到目前为止,我一直在使用如下带有水印的翻滚窗口。
.withWatermark("timestamp", "10 minutes") \
.groupBy(window("timestamp","1 day")) \
.count()
我的问题是,这是否是最好的方式(资源方面)来做这个每日汇总,或者我是否应该在更小的窗口上执行一系列的汇总(比如说每小时甚至更少),然后汇总这些每小时的计数器来实现每日计数。
此外,如果我尝试第二种方法,也就是较小的窗口,我怎么能做到这一点呢?
我不能在同一个spark流媒体应用程序中执行两个聚合(每小时和每天),我一直得到以下信息。
Multiple streaming aggregations are not supported with streaming
DataFrames/Datasets.
因此,我是否应该使用spark应用将每小时的汇总发布到Kafka主题,从另一个spark应用中读取这个流并执行每日汇总?
如果是,那么我应该如何在生产者中进行 "更新 "输出模式?第二个应用将从第一个应用中获取更新的值,因此这个 "汇总 "将是错误的。此外,添加任何 trigger
也不会与水印一起工作,因为任何晚到的事件都会导致之前的计数器更新,我将再次遇到同样的问题。
我认为你应该在所需的最短的时间跨度上执行聚合,然后在这些主aggs上执行二次聚合。对 1 day
将OOM你的工作,如果不是现在,那么肯定在未来。
这将增加一些DevOps的工作,但它是但你可以直观地实时监控你的应用程序。