我有一个流数据框架,我想计算一些每日计数器。 到目前为止,我一直在使用带有水印的滚动窗口,如下所示:
.withWatermark("timestamp", "10 minutes") \
.groupBy(window("timestamp","1 day")) \
.count()
我的问题是这是否是进行每日汇总的最佳方式(在资源方面),还是我应该在较小的窗口(例如每小时甚至更少)上执行一系列汇总,然后汇总这些每小时计数器以实现每日计数。
此外,如果我尝试第二种方法,即较小的窗户,该怎么办?
我无法在同一个Spark Streaming应用程序中执行两种汇总(每小时和每天),我不断得到以下信息:
Multiple streaming aggregations are not supported with streaming
DataFrames/Datasets.
因此,我是否应该使用spark应用程序将每小时汇总发布到Kafka主题,从另一个spark应用程序中读取此流并进行每日汇总?
如果是,那么我应该如何在生产者中使用“更新”输出模式?第二个应用程序将从第一个应用程序获取更新的值,因此此“总结”将是错误的。
而且,添加任何trigger
也不会与水印一起使用,因为任何迟到的事件都会导致先前的计数器更新,而我将再次遇到相同的问题。
答案 0 :(得分:1)
我认为您应该在所需的最短时间范围内执行聚合,然后对这些主要aggs执行辅助聚合。为1 day
执行agg将使您的工作变得井井有条,如果不是现在,那么肯定会在将来。
这会增加一些DevOps的工作量,但这是可以的,但是您可以直观地实时监视应用程序。