cassandra - 当数据具有不均匀的生成率时,如何在 cassandra 中对时间序列数据进行建模?
问题描述
我计划将数据从我现有的数据库 (Postgres) 迁移到 Cassandra。以下是该系统的简要概述:
- 当前数据集大小约为 20 亿
- 每个数据点代表一个事件。此事件的属性是 -
user_id
,event_name
,timestamp
- 这些数据来自一组有限的来源——为了简单起见,让我们假设 3 个不同的来源 S1、S2、S3——它们都推送到一个 Kafka 主题中。这个 cassandra 微服务正在使用来自这个主题的数据。
- 来自 S1、S2 和 S3 的数据速率不同。假设 S1 每分钟为单个用户推送 1 个事件,S2 每 15 分钟为每个用户推送 1 个事件,S3 每 1 小时为每个用户推送单个事件。
- 这个系统应该支持两种类型的查询
- 获取给定用户的最新事件
- 获取给定用户和日期范围的事件列表(此数据范围最多可以有 30 天的差异)
我正在尝试使用几种不同的方法对这些数据进行建模。
- 将单个用户的数据分区到每月存储桶中。为此
timestamp_year
,timestamp_month
添加了附加参数。timestamp
使用集群密钥。- 优点:小于 10 毫秒的写入延迟。最大分区大小约为 60MB(适用于 cassandra 3.11)。获取最新事件的时间不到 10 毫秒(99.999 个百分位)。
- 缺点:获取月级数据很慢,因为从单个分区读取的数据太多。如果我限制获取的记录数(比如说 10000),则延迟会提高。由于来自 3 个不同来源的数据速率不同,分区大小不均匀。
我尝试使用每周存储桶而不是每月存储桶和分页来改进其他参数。但这是我无法解决的问题分区大小不均匀,因为来自 3 个不同来源的数据速率不同。
如何在这样的数据模型中保持分区大小(几乎)一致?欢迎提出想法。
解决方案
这是一个经典问题,没有简单的解决方案可以使分区大小一致。如果您可以预测每个用户的摄取率,则可能您可以拥有不同的用户桶,例如高、中、低摄取用户。
根据类型,时间段会有所不同。对于摄取量高的用户,partition 意味着一天,对于摄取量低的用户,partition 意味着一个月。
为了加快对高摄取用户的月份查询,您可以运行 30 天的并行查询,看看它是否有助于优化您的查询时间。
推荐阅读
- java - 如何在java中将文本和数字组合的字符串转换为int类型?
- sql-server - 搜索查询 - 搜索多个表和列
- python - 运行 manage.py runserver 时出错
- javascript - Javascript 的 npm 解析不会检索所有字段
- mongodb - 使用 Moongose 在 MongoDB 中获取每天的平均值
- r - 如何从人口普查 Shapefile(邮政编码级别)中删除所有小岛?
- react-native - TextInput 全屏 onFocus 反应原生
- java - 如何在运行时 chromedriver selenium 中更改用户代理字符串
- sql - 是否可以将外键引用到父表?
- oracle - SQL Plus:如何防止数字的自动舍入