namenode 和 jobtracker 共享一个相似的 HA 实现,在某种程度上它们都扩展了相同的基类。它们都使用支持 zookeeper 集群来决定哪个可用节点处于活动状态。
zookeeper 中使用的位置是通过将故障转移组名称(即dfs.nameservices 和mapred.job.tracker 中给出的值)附加到可配置前缀来构造的。
默认情况下,这两种服务的可配置前缀都是/hadoop-ha。
这意味着如果两个服务配置了相同的故障转移组名称(例如,my-application),那么这两个服务使用的最终 zookeeper 路径将发生冲突。如果他们实际上使用同一个 zookeeper 集群,一个服务将无法获得 zookeeper 节点并破坏了自动故障转移。
解决办法是避免碰撞。最简单的方法是确保mapred-site.xml 中的mapred.job.tracker 和hdfs-site.xml 中的dfs.nameservices 不包含公共值。
也可以尝试为每个服务配置/hadoop-ha 前缀。它由ha.zookeeper.parent-znode 配置属性控制。
例如,在hdfs-site.xml 中可能有:
<property>
<name>ha.zookeeper.parent-znode</name>
<value>/hdfs-ha</value>
</property>
...而mapred-site.xml 包含:
<property>
<name>ha.zookeeper.parent-znode</name>
<value>/mapred-ha</value>
</property>
但是,请注意,在此配置中,hdfs-site.xml 和 mapred-site.xml 不能同时加载:一个键的值会破坏另一个键。
无论哪种方式,zookeeper 路径都会发生变化,需要重新运行相应的 -formatZK 命令。