我正在研究一些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作为比较器的例子,但没有关键验证器的例子。
非常感谢任何帮助或评论。
答案 0 :(得分:1)
首先,行超大不应该是cassandra的问题。尽管如此,它可能值得溢出行,因为在这种情况下,跨群集的数据分布将更加均匀。
ByteOrderedPartitioner
在这里看起来不是一个好选择,因为很难在群集中实现行的均匀分布,这将导致热点。
使用RandomPartitioner
时无法查询密钥范围。但是,如果最大N值相当小(最多256个)MultigetSliceQuery
可能用于查询整个行集。