1

Suppose I have several machines each having spark worker and cassandra node installed. Is it possible to require each spark worker to query only its local cassandra node (on the same machine), so that no network operation involved when I do joinWithCassandraTable after repartitionByCassandraReplica using spark-cassandra-connector, so each spark worker fetches data from its local storage?

4

1 に答える 1

2

Spark-Cassandra コネクタ内では、LocalNodeFirstLoadBalancingPolicyがこの作業を処理します。最初にローカル ノードを優先し、次に同じ DC 内のノードをチェックします。具体的java.net.NetworkInterfaceには、次のように、ローカル アドレスのリスト内のアドレスと一致するホスト リスト内のアドレスを検索するために、ローカル ノードが決定されます。

private val localAddresses =
  NetworkInterface.getNetworkInterfaces.flatMap(_.getInetAddresses).toSet

/** Returns true if given host is local host */
def isLocalHost(host: Host): Boolean = {
  val hostAddress = host.getAddress
  hostAddress.isLoopbackAddress || localAddresses.contains(hostAddress)
}

このロジックは、クエリの候補ホストのリストを返すクエリ プランの作成に使用されます。プラン タイプ (トークン対応または非対応) に関係なく、リストの最初のホストは、存在する場合は常にローカル ホストです。

于 2015-11-03T21:34:32.143 に答える