具有令牌范围的AllRowsReader类

时间:2015-04-14 08:14:02

标签: java cassandra cassandra-2.0 astyanax

这是使用 Astyanax 食谱中 AllRowsReader 类的示例:

reader = new AllRowsReader.Builder<>(keyspace, columnFamily)
        .withPageSize(1000)
        .withConcurrencyLevel(10)
        .withPartitioner(null)
        .withConsistencyLevel(ConsistencyLevel.CL_ONE)
        .withIncludeEmptyRows(false)
        .withTokenRange(startToken, endToken)
        .forEachRow(new Function<Row<String, String>, Boolean>() {
            @Override
            public Boolean apply(@Nullable Row<String, String> row) {
                startToken = keyspace.getPartitioner().getTokenForKey(row.getRawKey());

                // some other statements

                return true;
            }
        })
        .build();

reader.call();

,其中

startToken = keyspace.getPartitioner().getMinToken();
lastToken = keyspace.getPartitioner().getMaxToken();

如果要运行 AllRowsReader 而不使用“ withTokenRange(startToken,endToken)”,那么一切正常。但是使用“ withTokenRange(startToken,endToken)”并不是在列族读取期间获取所有行。

AllRowsReader的源代码为:

if (this.concurrencyLevel != null || startToken != null|| endToken != null) {
    List<TokenRange> tokens = partitioner.splitTokenRange(
            startToken == null ? partitioner.getMinToken() : startToken, 
            endToken == null   ? partitioner.getMinToken() : endToken, 
            this.concurrencyLevel == null ? 1 : this.concurrencyLevel);

            for (TokenRange range : tokens) {
                subtasks.add(makeTokenRangeTask(range.getStartToken(), range.getEndToken()));
            }
}

稍后 partitioner.getMinToken()将恢复为 maxToken 。所以我不明白我的做法有什么不同?为什么带有 minToken / maxToken AllRowsReader 与没有它们的 AllRowsReader 不同?

如果操作被终止,我会用最后一个 startToken 再次执行它(所以它必须是一个移位)。但在这种情况下,我看到之前有一些行被取出。这也让我感到困惑......

P.S。 Astyanax 自动确定 Murmur3Partitioner

感谢您的帮助。

链接: AllRowsReader sourceMurmur3Partitioner source

1 个答案:

答案 0 :(得分:0)

梅德, 将令牌范围视为一个响铃,因为圆圈完成开始将等于结束。为什么在astyanax代码中设置相同的标记为min和max。

startToken == null ? partitioner.getMinToken() : startToken, 
            endToken == null   ? partitioner.getMinToken() : endToken

我希望这能澄清你的答案。让我知道你是否有疑问