Cassandra CompositeType作为行键验证器

时间:2012-12-08 01:15:58

标签: nosql cassandra hector

我正在研究一些POC。

我有存储服务器事件的列族。为避免行超大,我们使用行键中的compositeType将每一行拆分为另外N行:

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

所以对于每个服务器名称,我们有N行,我们使用Very Simple Round Robin算法将数据写入每一行。

将数据写入任何行都没有问题:

   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作为比较器的例子,但没有关键验证器的例子。

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

1 个答案:

答案 0 :(得分:1)

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

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

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