1

我正在做一些 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 作为比较器的示例,但没有使用密钥验证器的示例。

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

4

1 回答 1

1

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

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

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

于 2012-12-08T16:55:55.507 回答