当前位置: 首页 > 知识库问答 >
问题:

时间序列数据的卡桑德拉:如何调整分区大小?

龙亮
2023-03-14

我正在尝试使用Cassandra来存储来自一些传感器的数据。我读了很多关于Cassandra的时间序列数据模型的文章。我从时间序列数据建模入门开始,“时间序列模式2”看起来是最好的方法。所以我创建了一个复制因子为2的键空间和一个这样的表

CREATE TABLE sensors_radio.draw (
dvid uuid,
bucket_time date,
utc_time double,
fft_size int,
n_avg int,
n_blocks int,
power double,
sample_rate double,
start_freq double,
PRIMARY KEY ((dvid, bucket_time), utc_time)

其中dvid是唯一的设备ID,bucket_time是一天(例如2017-08-30),utc_time是时间戳。

我的查询是

SELECT utc_time,start_freq,sample_rate,fft_size,n_avg,n_blocks,power
FROM sensors_radio.draw 
WHERE dvid=<dvid> 
AND bucket_time IN (<list-of-days>) 
AND utc_time>=1.4988002E9 
AND utc_time<1.4988734E9;

如您所见,我需要从多天中检索数据,这意味着在我的集群中读取多个分区。在我看来,查询性能看起来很差,这是可以理解的,因为IN反模式。

编辑:我试图通过将我的查询拆分为多个来避免IN反模式,但我没有得到性能改进。

我想用一个月而不是一天来增加分区大小,因为bucket_time用我的查询来查询单个分区。但是我担心分区会增长太多!通过阅读这个问题的答案,我认为一个月内我的分区将有大约5亿个单元(所以远远低于20亿限制),但是它当然会超过100MB的大小限制和100000行的限制。

在这种情况下推荐的数据模型是什么?大磁盘大小的分区是问题吗?

提前致谢。

我在一个由3个节点(8核,16GB内存)组成的集群上使用Cassandra 3.10

共有2个答案

毋玺
2023-03-14

其实你对列值大小的理解是错误的。

限制在20亿左右-这与行数无关,而是常规列和簇键的工作方式

将此公式用于< code > Nv = Nr(Nc Npk Ns)Ns

分区 (Nv) 中的值(或单元格)数等于静态列数 (Ns) 加上行数 (Nr) 和每行值数的乘积。每行的值数定义为列数 (Nc) 减去主键列数 (Npk) 和静态列数 (Ns)。

简短的描述将是行数乘以常规列数

在您的情况下,它将是:

(500 000 000 * (9 - 3 - 0) + 0) = 3 000 000 000

所以你超出限制了20亿

你在磁盘上的分区大小将是一个巨大的

(20 + 0 + (500000000 * 84) + (8 * 3000000000)) = 
66000000020 bytes (62942.50 Mb)

显然超过100 Mb cassandra限制

我用我的开源项目- cql-calculator计算的。

慕凌龙
2023-03-14

正如您所说,使用IN的查询可能非常慢,因为在您的案例中需要读取多个分区,但是您的查询是从一个协调器节点处理的(如果可能的话,通常选择该节点作为负责分区的节点)。

此外,大分区在过去一直是一个噩梦-在3.6和更高版本中,它应该不会那么糟糕(见https://de . slide share . net/DataStax/myths-of-big-partitions-Robert-stupp-DataStax-Cassandra-summit-2016)。读取性能和内存压力一直是严重的问题。

对我来说效果很好的是——但这取决于您的用例——去使用“足够小”的桶(一天),一个月异步并行地发出31个查询,然后将它们重新加入到您的代码中。例如,在java中,未来会支持你这样做。这样,每个查询只命中一个桶/分区,集群中的所有节点很可能并行处理您的查询。

 类似资料:
  • 我每天都在cassandra中存储时间序列数据。我们希望每天归档/清除超过2天的数据。我们正在使用Hector API来存储数据。有人能建议我每天删除超过2天的cassandra数据的方法吗?对cassandra行使用TTL方法是不可行的,因为删除数据的天数是可配置的。现在表格中没有时间戳列。我们计划添加时间戳列。但问题是,时间戳不能单独用于where子句,因为这个新列不是主键的一部分。请提供您的

  • 我用Spring Data Cassandra 2.2.1开发了一个新的应用程序,想在Cassandra 2.1.9服务器上运行它(旧的,我知道)。但是我们得到了错误 Spring数据卡桑德拉手册声称Spring数据2.2.1至少需要卡桑德拉2.1,所以这应该有效,但它没有。我们包含的唯一特定于卡桑德拉的依赖项是 我怎样才能让这个工作?

  • 我正在尝试评估Cassandra DB在存储和检索不同通道的时间序列数据方面的性能。 数据以文件格式记录,最大记录速率为8个样本/秒,每个样本都有一个以毫秒为单位的时间戳。给定时间记录的通道数可能会有所不同。 受以下链接的启发,我使用时间序列数据建模入门创建了以下表: 创建表uhhdata ( ch_idx int,date timestamp,dt timestamp,val float,PRI

  • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为

  • 全能的开发者们。我在Spark中运行一些基本的分析,在这里我查询多节点Cassandra。我正在运行的代码以及我正在处理的一些非链接代码是: Spark的版本是1.6.0,Cassandra v3。0.10,连接器也是1.6.0。键空间有,表有5列,实际上只有一行。如您所见,有两个节点(OracleVM中制作的虚拟Macine)。 我的问题是,当我测量从spark到cassandra的查询时间时,

  • 我目前在cassandra中有一个名为macrecord的表,类似于以下内容: 在这种情况下,我想不出其他解决方案,只有在macadd值重复的情况下删除整行,然后插入具有更新时间戳的新行。 是否有更好的解决方案在macadd值重复时更新时间戳,或者在我的原始表中只有macadd是主键的范围内查询时间戳值的替代方法。