火花流。每天进行一次汇总

问题描述 投票:0回答:1

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

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

apache-spark pyspark spark-streaming
1个回答
1
投票

我认为你应该在所需的最短的时间跨度上执行聚合,然后在这些主aggs上执行二次聚合。对 1 day 将OOM你的工作,如果不是现在,那么肯定在未来。

  1. 每小时或5分钟进行一次聚合计数,并将其记录在时间序列DB中,如Prometheus Graphite。
  2. 使用Grafana绘制这些指标,在主要聚合之上执行二级聚合,如每日计数。

这将增加一些DevOps的工作,但它是但你可以直观地实时监控你的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.