LocalNodeFirstLoadBalancingPolicy 也从除 local_dc 以外的数据中心添加节点

问题描述

在LocalNodeFirstLoadBalancingPolicy的documentation中提到-

先选择本地节点,然后以随机顺序选择本地 DC 中的节点。从不从其他 DC 中选择节点。对于写入,如果语句具有路由键集,则此 LBP 是令牌感知的 - 它更喜欢作为计算令牌副本的节点而不是其他节点。

但是在我的 spark 作业日志中,我可以找到所有节点都在添加集群。

21/05/05 10:08:40 INFO CassandraWriter$: Setting local_dc: DC1
21/05/05 10:08:40 INFO CassandraWriter$: Writing to DC: DC1,available host ips: x.x.x.54,x.x.x.237,x.x.x.168,x.x.x.197,x.x.x.219
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.219:9042 added
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.237:9042 added
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.54:9042 added
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.238:9042 added
21/05/05 10:08:41 INFO LocalNodeFirstLoadBalancingPolicy: Added host x.x.x.238 (DC2)
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.168:9042 added
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.42:9042 added
21/05/05 10:08:41 INFO LocalNodeFirstLoadBalancingPolicy: Added host x.x.x.42 (DC2)
21/05/05 10:08:41 INFO Cluster: New Cassandra host /x.x.x.109:9042 added
21/05/05 10:08:41 INFO LocalNodeFirstLoadBalancingPolicy: Added host x.x.x.109 (DC2)

谁能帮我理解为什么要添加 DC2 节点?根据我的理解,协调器节点总是从 local_dc 中选择。

我也尝试在不设置 spark.cassandra.connection.local_dc 的情况下运行摄取,并且看到了相同的日志。

见下面的写代码

records.write.cassandraFormat(table,keySpace)
  .mode(SaveMode.Append)
  .option(CassandraConnectorConf.LocalDCParam.name,cassandraDC.name)
  .option(CassandraConnectorConf.ConnectionHostParam.name,cassandraDC.availableHosts.mkString(","))
  .save()

PS:我有单独的 spark 和 cassandra 集群,我的用例是将数据从 spark 集群写入 cassandra。

解决方法

您可以忽略这些消息。这就是 Cassandra 的工作方式 - 驱动程序在初始化时发现集群的完整拓扑,然后决定仅使用给定数据中心的特定节点。

例如,New Cassandra host /x.x.x.54:9042 added 之类的消息是 coming from Java driver。像 Added host x.x.x.238 (DC2) 这样的消息是 coming from LocalNodeFirstLoadBalancingPolicy 必须覆盖接口中的函数。但是,负载均衡策略doesn't use the nodes that aren't in the local data center,虽然总是保留所有节点的映射。