假设我有几台机器,每台机器都安装了spark worker和cassandra节点。是否有可能要求每个spark工作者只查询其本地cassandra节点(在同一台机器上),这样当我使用spark-cassandra-connector重新分区,然后使用spark-cassandra-connector进行repartitionByCassandraReplica时,不会涉及网络操作,因此每个spark工作者都从本地获取数据存储?
答案 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)
}
此逻辑用于创建查询计划,该计划返回查询的候选主机列表。无论计划类型(令牌识别或不知道),列表中的第一个主机始终是本地主机(如果存在)。