如何让工人只查询本地卡桑德拉节点?
How to make workers to query only local cassandra nodes?
假设我有几台机器,每台机器都安装了 spark worker 和 cassandra 节点。是否可以要求每个 spark worker 仅查询其本地 cassandra 节点(在同一台机器上),这样当我使用 spark-cassandra-connector 在 repartitionByCassandraReplica 之后执行 joinWithCassandraTable 时不涉及网络操作,因此每个 spark worker 从其本地获取数据贮存?
在 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)
}
此逻辑用于创建查询计划,其中 returns 用于查询的候选主机列表。无论计划类型如何(令牌感知或不感知),列表中的第一个主机始终是本地主机(如果存在)。
假设我有几台机器,每台机器都安装了 spark worker 和 cassandra 节点。是否可以要求每个 spark worker 仅查询其本地 cassandra 节点(在同一台机器上),这样当我使用 spark-cassandra-connector 在 repartitionByCassandraReplica 之后执行 joinWithCassandraTable 时不涉及网络操作,因此每个 spark worker 从其本地获取数据贮存?
在 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)
}
此逻辑用于创建查询计划,其中 returns 用于查询的候选主机列表。无论计划类型如何(令牌感知或不感知),列表中的第一个主机始终是本地主机(如果存在)。