获取cassandra中partitionID的所有记录会产生RPC超时

时间:2013-03-19 06:35:05

标签: cassandra

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

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

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

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

从架构中选择*,其中TimeStamp ='..'

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

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

1 个答案:

答案 0 :(得分:1)

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

然而,较慢的事情可能是CPU反序列化,比较其他副本的结果并序列化回客户端。我怀疑你能在rpc_timeout中为500k对象做到这一点(默认为10秒)。

为此,您应该翻阅结果。

首次查询,请执行

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

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

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

直到您在响应中获得少于1000列。

相关问题