Чтение данных из нескольких узлов в кассандре параллельно между узлами - PullRequest
0 голосов
/ 10 сентября 2018

Я использую Cassandra версии 3.11.3, и я создал кластер Cassandra из 2 узлов на моей локальной машине.

Я создаю искровое задание (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;
  }

Итак, в соответствии с описанной выше настройкой, я предполагал, что получу 2 TokenRange при вызове метода getTokenRangesAcrossNodes, так как у меня есть 2 узла. Но вместо этого я получил 256. Затем я немного прочитал vnodes, поэтому я предполагаю, что диапазон его токенов состоит из нескольких vnodes. Кроме того, когда я использую коэффициент репликации как 2, я получаю 512.

Мой первый вопрос: как решился этот 256 или 512 TokenRange?

Во-вторых, через мою работу, если я буду запрашивать все эти диапазоны токенов параллельно, не будет ли возможно, что многие диапазоны не возвращают никакого результата, и я заканчиваю тем, что в большинстве случаев запрашиваю безрезультатный результат? Разве не лучше получить диапазоны токенов, специфичные для узлов, а не для vnodes?

Последний вопрос, если я хочу получить токеновый диапазон узлов (не vnodes), какое изменение мне нужно внести в вышеуказанную настройку?

...