【问题标题】:Cassandra CompositeType as row key ValidatorCassandra CompositeType 作为行键验证器
【发布时间】:2012-11-26 05:50:39
【问题描述】:

我正在做一些 POC。

我有存储服务器事件的列族。为了避免行过大,我们在行键中使用复合类型将每一行拆分为另外 N 行:

CREATE COLUMN FAMILY logs with comparator='ReversedType(TimeUUIDType)' and key_validation_class='CompositeType(UTF8Type,IntegerType)' and default_validation_class=UTF8Type;

所以对于每个服务器名称,我们有 N 行,我们使用非常简单的循环算法将数据写入每一行。

向任意行写入数据都没有问题:

   Mutator<Composite> mutator = HFactory.createMutator(keySpace, CompositeSerializer.get());
    HColumn<UUID,String> col = 
    HFactory.createColumn( TimeUUIDUtils.getUniqueTimeUUIDinMillis(), log);
    Composite rowName = new Composite();
    rowName.addComponent(serverName, StringSerializer.get());
    rowName.addComponent(this.roundRobinDestributor.getRow(), IntegerSerializer.get());
    mutator.insert(rowName, columnFamilyName, col);
}

到目前为止一切顺利,但现在我有两个问题:

1) 由于如果我想获取某个 serverName 的所有日志,我会扫描行键,我应该使用ByteOrderedPartitioner吗?

2) 任何人都可以帮助我,或者告诉我一些帮助如何创建 Hector 查询,它将为 server1 带来所有行({server1:0}、{server1:1} {server1:2) 等。 .)?我看到很多使用 CompositeType 作为比较器的示例,但没有使用密钥验证器的示例。

非常感谢任何帮助或评论。

【问题讨论】:

    标签: nosql cassandra hector


    【解决方案1】:

    首先,行过大在 cassandra 中应该不是问题。尽管如此,溢出行可能值得,因为在这种情况下,跨集群的数据分布会更加均匀。

    1. ByteOrderedPartitioner 在这里看起来不是一个好的选择,因为很难在集群中实现行的均匀分布,这会导致热点。

    2. 使用RandomPartitioner 时无法查询键的范围。但是,如果最大 N 值相当小(最多 256)MultigetSliceQuery 可能用于查询整组行。

    【讨论】:

    • 感谢您的评论,但如果我的行将增长到大于集群中节点的大小怎么办?据我了解,没有其他方法可以在集群中拆分单行。
    • @danny.lesnik:当然,在这种情况下需要拆分,我没有想到那么大行。无论如何,我的其余答案仍然有效:不要使用 ByteOrderedPartitioner,因为它将整个范围放在单个服务器上,并且具有适当列范围的 MultigetSliceQuery 应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2016-09-26
    • 2019-02-16
    • 2018-08-30
    • 2022-07-26
    相关资源
    最近更新 更多