时间序列数据的Cassandra:如何调整分区大小?

时间序列数据的Cassandra:如何调整分区大小?,cassandra,time-series,Cassandra,Time Series,我正在尝试使用卡桑德拉存储来自一些传感器的数据。 我读了很多关于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 d

我正在尝试使用卡桑德拉存储来自一些传感器的数据。 我读了很多关于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\u time
是一天(例如2017-08-30),而
utc\u 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;
选择utc时间、开始频率、采样率、fft大小、n平均值、n块、功率
从传感器_radio.draw
其中dvid=
和bucket_time IN()
utc_时间>=1.4988002E9

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

此外,大型分区在过去一直是一场噩梦——在3.6及以后的版本中,它应该不会那么糟糕(请参阅)。读取性能和内存压力一直是严重的问题


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

实际上,您理解列值大小的含义是错误的

限制大约20亿行,这不是行数的问题,而是常规列和集群键的工作方式

将此公式用于
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 Mbcassandra限制


我使用我的开源项目计算它-。

实际上是一种反模式,因为多分区查询通常“太慢”。磁盘上的大分区也会导致压缩和读取性能出现一些其他问题。我强烈建议从3.2迁移到3.11,特别是3.9之前的版本有很多问题。对不起,我的错误。我用的是卡桑德拉3.10。如果我更新到3.11,我会丢失数据吗?升级cassandra是非常安全的-请注意您的配置。阅读您对新cassandra.yaml的所有更改,并查找
nodetool upgradesstables
(请参阅)Hi@Mandraenke,感谢您的回答。将查询拆分为多个查询是正确的。这是我在阅读后已经做过的,但我没有任何性能改进(完全相同的执行时间)。我没有提到它,因为我的问题会变得太复杂。我现在要更新它。你是异步执行它们的吗?是的,正如链接中的文章所述。我尝试了这个:我执行了一个来自Java的查询,分为4个部分,异步,带futures。检索所有2812033行需要大约40秒。你觉得那次怎么样?这是否合理?大约为每秒70k行-如果可以,则不取决于行大小-监视网络带宽WITDH,并在集群节点上加载,并在发出查询的服务器上加载带宽。要指出的是,您的4个查询中是否仍有