如何让worker只查询本地cassandra节点?

时间:2015-11-02 14:44:49

标签: cassandra apache-spark spark-cassandra-connector

假设我有几台机器,每台机器都安装了spark worker和cassandra节点。是否有可能要求每个spark工作者只查询其本地cassandra节点(在同一台机器上),这样当我使用spark-cassandra-connector重新分区,然后使用spark-cassandra-connector进行repartitionByCassandraReplica时,不会涉及网络操作,因此每个spark工作者都从本地获取数据存储?

1 个答案:

答案 0 :(得分: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)
}

此逻辑用于创建查询计划,该计划返回查询的候选主机列表。无论计划类型(令牌识别或不知道),列表中的第一个主机始终是本地主机(如果存在)。