对于时间序列汇总/聚合,流处理是不是优于批处理?

Posted

技术标签:

【中文标题】对于时间序列汇总/聚合,流处理是不是优于批处理?【英文标题】:Is stream processing better than batch processing for time series Roll up/Aggregation?对于时间序列汇总/聚合,流处理是否优于批处理? 【发布时间】:2019-03-25 09:22:35 【问题描述】:

背景 -

时间序列数据被提取到我存储在 Cassandra 中的 Apache Kafka 中。由于原始数据需要大量存储空间,我正在尝试汇总数据并创建每小时、每天、每月汇总以进行报告。有两种方法,我能想到:

    流处理: 使用 Kafka Streams API 汇总数据并在 Cassandra 中提取汇总数据。 批处理: 将原始数据摄取到 Cassandra 中,并维护新摄取键的索引。运行调度程序从索引表中获取自上次运行以来新摄取的键,从 Cassandra 获取时间序列,汇总并存储到每小时、每日表中。

您认为哪种方法更好,为什么?

我尝试了批处理方法。它使我能够赶上数据,即使我的汇总系列失败/下降了一段时间。但我认为,为我提供可靠性是在浪费大量资源。

我希望在不消耗太多资源的情况下完成汇总。

【问题讨论】:

【参考方案1】:

这两种解决方案都是可行的。由于我对 Cassandra 的经验很少,我只会提到使用 Kafka Streams 解决这个问题的可能性:

Kafka Streams 使用窗口和聚合支持此用例开箱即用: https://kafka.apache.org/20/documentation/streams/developer-guide/dsl-api.html#windowing https://kafka.apache.org/20/documentation/streams/developer-guide/dsl-api.html#streams-developer-guide-dsl-aggregating

它还允许处理迟到的记录:

https://kafka.apache.org/20/documentation/streams/core-concepts.html#streams_concepts_aggregations

使用 Kafka Streams,您无需维护除 Kafka 之外的单独数据库,所有聚合都将在您的客户端应用程序中运行。在内部,Kafka Streams 将使用 RocksDB 作为存储选项。可以将聚合结果写入单独的输出主题或使用交互式查询功能进行查询:

https://kafka.apache.org/10/documentation/streams/developer-guide/interactive-queries.html

此页面包含一些高级示例:

https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Stream+Usage+Patterns

【讨论】:

值得注意的是,执行的流式聚合可以写回 Kafka 主题,并从那里通过 Kafka Connect 流式传输到 Cassandra(或其他任何需要它们的地方)。您还可以使用 KSQL 代替 Kafka Streams。

以上是关于对于时间序列汇总/聚合,流处理是不是优于批处理?的主要内容,如果未能解决你的问题,请参考以下文章

天蓝色流分析是不是读取来自所有分区的数据

Flink概念:编程模型下

为啥对于输出流,'\n' 优于 "\n"?

Flink流处理随笔(上)

流处理- 状态与一致性模型

为啥在处理客户端请求时异步模式优于同步模式?