火花流:每天进行汇总

时间:2020-04-23 14:41:25

标签: apache-spark pyspark spark-streaming

我有一个流数据框架,我想计算一些每日计数器。 到目前为止,我一直在使用带有水印的滚动窗口,如下所示:

.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也不会与水印一起使用,因为任何迟到的事件都会导致先前的计数器更新,而我将再次遇到相同的问题。

1 个答案:

答案 0 :(得分:1)

我认为您应该在所需的最短时间范围内执行聚合,然后对这些主要aggs执行辅助聚合。为1 day执行agg将使您的工作变得井井有条,如果不是现在,那么肯定会在将来。

  1. 执行每小时一次或5分钟的一次主计数,并将它们记录在时间序列数据库中,例如Prometheus / Graphite。
  2. 使用grafana绘制这些指标,在主要汇总的基础上执行次要汇总,例如每日计数。

这会增加一些DevOps的工作量,但这是可以的,但是您可以直观地实时监视应用程序。