3

我想了解在 Cassandra (v1.2) 中获取大量顺序存储在磁盘中的行时所涉及的开销是什么。

使用以下架构:

  • 时间戳
  • 设备ID
  • 设备名称
  • 设备所有者
  • 设备颜色

PKEY(时间戳,设备 ID)。
每条记录为 80 字节。

我正在尝试获取特定时间戳(partitionID)的所有行。

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

每个时间戳有 500K 这样的行。我发现进行分页会比尝试一次性获取所有内容提供更好的吞吐量。因此,要获取 500 K 行(40 MB),使用 1000 / 10000 的页面大小,大约需要 25-30 秒(我使用的是 Astyanax)。我有以下问题:

(A) 我查询的所有数据是否会按特定时间戳顺序存储在磁盘中(是的,我已经运行了 compact 命令)?

(B) 如果对第一个 qn 的回答是肯定的,那么为什么我不能获得等于磁盘的吞吐量(40 MB/s)?请注意,我能够在 25-30 秒内检索 40 MB 的数据,这相当于几乎 1.5 MB/s。

(C) 如果上述第一个问题的答案是肯定的,那么我可以进一步加快响应速度吗?

(D) 序列化/反序列化是吞吐量慢的罪魁祸首吗?如果是这样,可以做些什么来完全避免它吗?

4

1 回答 1

0

A)它取决于您为集群配置的分区器(在 cassandra.yaml 文件中),因为您是新手,您可能正在使用默认提供的分区器(MurMur3Partitioner),这意味着您的问题的答案是否定的,数据在 1 个或多个物理节点内被拆分为不同的节点(或虚拟节点),这意味着数据存储在磁盘的不同部分和不同的物理节点上。

B) 对 A 的回答是否定的,所以可能不会

C)对 B 的回答是否定的,您仍然应该能够对不同的查询进行计时并检测瓶颈以提高速度。运行此命令后使用 cqlsh:

cqlsh> tracking on Now 跟踪请求。

并运行您要检查的查询/查询并查看节点之间的不同交互。您可以使用它来检查在使用 ButeOrderedPartitioner 时是否以您需要的方式存储了一个 partitionID

D)它不应该是一个问题,但以防万一在 cqlsh 上运行相同的查询,并按照 C 中的说明跟踪请求的时间

希望能帮助到你!

于 2013-11-22T19:00:34.817 回答