cassandra UTF8或LongType中的密钥验证类类型?

时间:2014-01-26 07:02:14

标签: java nosql cassandra bigdata

使用cassandra,我想在列族中存储2000万行行密钥。

我的问题是:

  1. long和utf8 rowKey键之间是否存在真正的性能差异?

  2. 任何行密钥存储大小问题?

  3. 我的用户密钥看起来像这样

    rowKey=>112512462152451
    rowKey=>135431354354343
    rowKey=>145646546546463
    rowKey=>154354354354354
    rowKey=>156454343435435
    rowKey=>154435435435745
    

2 个答案:

答案 0 :(得分:5)

  1. Cassandra将所有磁盘数据(包括行键值)存储为十六进制字节数组。在性能方面,行键的数据类型确实无关紧要。它唯一重要的地方是行键的类型验证器/比较器将影响磁盘上的排序顺序。因此,在您的情况下,Long将与UTF8(ascii-betical)进行不同的排序(数值)。

  2. 我找不到相关的确切来源,但我记得读过行键的最大大小是64K(你似乎在那之下)。默认情况下启用密钥缓存,除非另有说明,否则将缓存200,000个密钥。是否在任何给定时间缓存200,000个密钥就足够了,这取决于您的应用程序的要求。您可以根据可用RAM的数量来增加它,但是您应该在小的增量调整中进行测试。

  3. 检查Datastax文档以获取有关how to tune the row and key cache properties的说明。

    同样eBay posted a good article on Cassandra data modeling讨论了可能对您有帮助的正确行选择/创建。

答案 1 :(得分:4)

  1. 没有
  2. 通常,您不希望行键过大。这是因为磁盘上的索引文件会变大并且不适合内存,因此如果没有缓存密钥,您最终也必须转到磁盘进行密钥查找。多大程度上取决于您的硬件资源。
  3. 在Cassandra 1.1中,曾经存在代码:

    的问题

    https://git-wip-us.apache.org/repos/asf?p=cassandra.git;a=blob;f=src/java/org/apache/cassandra/service/CacheService.java;hb=02672936#l102

    将使用48字节的常量值作为密钥缓存行大小的平均值来估计密钥缓存使用的内存量。如果某人有长密钥,代码逻辑最终会导致密钥缓存的堆使用量超过cassandra.yaml中配置的密钥缓存量。这已在Cassandra 1.2中修复。

    我通常建议我的开发人员不要超过32字节的密钥。