从Cassandra中的多个节点跨节点并行读取数据

时间:2018-09-10 07:21:46

标签: java cassandra-3.0

我正在使用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)的令牌范围,我需要在上述设置中进行哪些更改?

0 个答案:

没有答案