1

我正在使用 Cassandra 1.2.1、复合键并尝试获取特定 partitionID 的所有记录。以下是我正在使用的架构:

  • 时间戳
  • 设备ID
  • 数据传输
  • 位置 ID
  • 设备所有者

主键是一个复合键:(TimeStamp, Device ID)。因此时间戳是分区键。每条记录将是 70-80 字节。

有 1000 个不同的 TimeStamp,每个时间戳都有 500K 设备 ID。所以有 5 亿条记录,我想获取特定时间戳的所有记录。类似于:

从 TimeStamp = '..' 的架构中选择 *

我的理解是这个查询应该能够快速获取所有记录,因为相关行都存储在连续的磁盘位置,这意味着很少有磁盘搜索会给我们结果。过滤器在 TimeStamp 上,这意味着查询只会命中一个节点。此外,数据总量为 500K * 80 字节 ~ 40 MB,也不算多。但是,当我使用 CQL (3) 或 Astyanax 运行它时,我得到了 RPC 超时。

我对 partitionID 的所有记录都在连续磁盘位置的理解是否错误?批量获取此类数据的正确方法应该是什么?

4

1 回答 1

1

最终这些列将在磁盘上彼此靠近,因为它们在同一行中。但在压缩完成之前(即假设您不运行 nodetool compact),它们不会。但是它们应该被分成几个 SSTables。

但是,较慢的可能是 CPU 反序列化,比较其他副本的结果并序列化回客户端。我怀疑您是否可以在 rpc_timeout (默认为 10 秒)内对 500k 个对象执行此操作。

为此,您应该对结果进行分页。

对于您的第一个查询,请执行

SELECT * from schema where TimeStamp = '..' limit 1000

然后取最后一个设备 ID 并最后调用它:

SELECT 'last'..'' from schema where TimeStamp = '..' limit 1000

直到响应中的列数少于 1000。

于 2013-03-19T07:59:38.457 回答