背景-
时间序列数据是在apachekafka中摄取的,我将其存储在cassandra中。由于原始数据需要大量的存储空间,因此我尝试聚合数据并创建每小时、每天、每月的汇总报告。我可以想到两种方法:
流处理:使用kafka streams api来汇总数据,并在cassandra中摄取汇总的数据。
批处理:将原始数据摄取到cassandra中,并维护新摄取的键的索引。运行调度程序从索引表中提取自上次运行以来新摄取的键,从cassandra中提取时间序列,汇总并存储到每小时、每天的表中。
你认为哪种方法更好?为什么?
我试过批量处理的方法。它使我能够赶上数据,即使我的汇总序列有一段时间失败/下降。但我认为,为我提供这种可靠性是在浪费大量资源。
我希望在不消耗太多资源的情况下完成汇总。
1条答案
按热度按时间5jvtdoz21#
两种解决方案都是可行的。由于我对Cassandra没有什么经验,我将只提及用Kafka流解决这个问题的可能性:
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-开发者指南dsl聚合
它还允许处理迟到记录:
https://kafka.apache.org/20/documentation/streams/core-concepts.html#streams_concepts_aggregations
使用kafka流,除了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