Cassandra中列族的行数

48

在Cassandra中,有没有一种方法可以获取单个列族的行计数(键计数)?get_count只能用于获取列计数。

例如,如果我有一个包含用户的列族,并想要获取用户数量。我应该怎么做?每个用户都是它自己的行。

6个回答

40

如果你正在处理一个大数据集并且可以接受一个相当不错的近似值,我强烈推荐使用以下命令:

nodetool --host <hostname> cfstats

这将为每个列族输出一个类似于这样的列表:

Column Family: widgets
SSTable count: 11
Space used (live): 4295810363
Space used (total): 4295810363
Number of Keys (estimate): 9709824
Memtable Columns Count: 99008
Memtable Data Size: 150297312
Memtable Switch Count: 434
Read Count: 9716802
Read Latency: 0.036 ms.
Write Count: 9716806
Write Latency: 0.024 ms.
Pending Tasks: 0
Bloom Filter False Postives: 10428
Bloom Filter False Ratio: 1.00000
Bloom Filter Space Used: 18216448
Compacted row minimum size: 771
Compacted row maximum size: 263210
Compacted row mean size: 1634

“Number of Keys(estimate)”这一行是对整个集群的很好的猜测,并且其性能比显式计数方法要快得多。


3
键数不是针对整个集群的估计,而是针对特定节点的估计,是这样吗? - Christopher Smith
是的。nodetool联系ColumnFamilyStoreMBean,它使用ColumnFamilyStore,后者使用DataTracker,后者返回每个本地SSTable创建的估计值之和。 - Martin Serrano
3
“nodetool --host <hostname> cfstats”给出了这个网址 https://gist.github.com/cdwijayarathna/e6b4d3d7d8c272fcfd24 ,但是没有“Number of Keys”属性,这是什么原因? - Chamila Wijayarathna
看起来他们在2.0中删除了这个信息 https://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsCFstats.html - nils petersohn

6

如果您使用的是保序分区器,则可以使用get_range_slice或get_key_range进行此操作。

如果不是,则需要将用户ID存储在特殊行中。


3
如果我有数百万行数据怎么办?对于简单的计数操作,get_range_slice 感觉有些沉重。我的看法正确吗? - Henri Liljeroos
4
你说得对,在分布式系统中,与你在可以将索引保留在本地内存中的系统上所使用的相比,统计原始对象的成本相对较高。 - jbellis

6

11
不好的解决方案:在大表上,您会遇到rpc_timeout错误,因为它将扫描整个表。 - Vlad

2
这是一段关于Cassandra的文本:

[编辑:自Cassandra 0.8.1以来,此答案已过时 - 请参见Cassandra Wiki中的计数器条目以了解在Cassandra中处理计数器列的正确方法。]

我对Cassandra还很陌生,但我已经在Google的App Engine上进行了很多尝试。如果没有其他解决方案,您可以考虑在支持原子递增操作的平台(如memcached)中保留单独的计数器。 我知道Cassandra正在开发原子计数器递增/递减功能,但它还没有准备好面向主流。

由于我是新手,因此只能发布一个超链接,请参见我的下面评论中的链接以获取有关计数器支持进展的信息。

请注意,此线程建议ZooKeeper、memcached和redis作为可能的解决方案。 我个人更喜欢memcached。

http://www.mail-archive.com/user@cassandra.apache.org/msg03965.html


2
请查看https://issues.apache.org/jira/browse/CASSANDRA-1072以了解Cassandra计数器支持的进展。 - Ben Burns
CounterColumn现在在0.8.1及以上版本中得到支持。 - Bamboo
谢谢,Bamboo。这是一个相当古老的答案,我的Cassandra工作在2011年初就停止了。不过我会更新一个链接。 - Ben Burns

0

通常都会使用map/reduce,但这可能是不言自明的。如果你在hive或pig中使用它,那么你可以对集群中的任何表执行操作,尽管我不确定tasktracker是否知道cassandra的本地性,因此它可能必须在网络上流式传输整个表,以便你在cassandra节点上获取tasktracker,但它们接收到的数据可能来自另一个cassandra节点:(。如果有人确切知道,请告诉我。

注意:我们主要在cassandra上设置map/reduce,因为如果以后需要索引,我们可以将其映射/减少到cassandra中。


-3

在 PHP 中将数据转换为哈希后,我一直像这样获取计数。


3
很明显,这种方法不具有可扩展性,因为在某个时候,哈希值将无法(有用地)再适应于PHP的内存中。Cassandra是用于可扩展的内容。 - MarkR
我知道 - 这就是让我担心的。我还处于开发阶段,正在寻找更好的解决方案来解决这类问题。 - Philip Schlump

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接