我正在使用cassandra版本3.11.3,并且已经在本地计算机中创建了2个节点的cassandra集群。
我正在创建一个火花作业(Java),该作业并行使用所有Cassandra节点中的数据。
我正在使用以下设置来获取我的集群的TokenRange Set 键空间:
CREATE KEYSPACE test_keyspace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 }
private static Host getLocalHost(Metadata metadata, LoadBalancingPolicy policy) {
Set<Host> allHosts = metadata.getAllHosts();
StringBuilder s = new StringBuilder();
Host localHost = null;
for (Host host : allHosts) {
if (policy.distance(host) == HostDistance.LOCAL) {
localHost = host;
break;
}
}
return localHost;
}
public static TokenRange[] getTokenRangesAcrossNodes() {
Metadata metadata = cluster.getMetadata();
Host localhost =
getLocalHost(metadata, cluster.getConfiguration().getPolicies().getLoadBalancingPolicy());
return unwrapTokenRanges(metadata.getTokenRanges("test_keyspace", localhost))
.toArray(new TokenRange[0]);
}
private static Set<TokenRange> unwrapTokenRanges(Set<TokenRange> wrappedRanges) {
Set<TokenRange> tokenRanges = new HashSet<>();
for (TokenRange tokenRange : wrappedRanges) {
tokenRanges.addAll(tokenRange.unwrap());
}
return tokenRanges;
}
因此,根据上述设置,我假设当我调用方法getTokenRangesAcrossNodes
时我将获得2 TokenRange,因为我有2个节点。但是我得到了256。然后,我对vnode进行了一些阅读,因此我假设其令牌范围是多个vnode。此外,当我使用复制因子2时,得到512。
我的第一个问题是如何确定256或512 TokenRange?
第二,如果通过我的工作并行查询所有这些标记范围,难道很多范围都不会返回任何结果,而在大多数情况下我最终都没有结果查询吗?获得特定于节点而不是vnode的令牌范围不是更好吗?
最后一个问题,如果我想获取节点(而不是vnodes)的令牌范围,我需要在上述设置中进行哪些更改?