ZKFC Mismatched address异常

本文介绍当高可用集群中的ZKFC(ZooKeeper Failover Controller)日志出现Mismatched address stored in ZK异常时,导致HDFS无法选出Active NameNode问题的原因及解决方案。

具体报错

java.lang.RuntimeException: Mismatched address stored in ZK for NameNode at /**.**.**.**:8020: Stored protobuf was nameserviceId: "hdfs-cluster"
namenodeId: "nn1"
port:8020
zkfcPort:8019
,address from our own configuration for this NameNode was xxxxx.emr.aliyuncs.com/**.**.**.**:8021

问题原因

该问题通常说明高可用集群中的ZKFC在ZooKeeper中存储的NameNode的信息与Hadoop配置文件中的不匹配,导致HDFS无法选出Active NameNode。存储在ZKFC中的端口是8020,而实际的NameNode ServiceRPC的端口是8021。早期部分EMR版本未开启ServiceRPC功能,如果您手动配置了ServiceRPC的8021端口,则需要初始化ZKFC的信息。

解决方案

方案一

  1. 在EMR控制台停止ZKFC组件。

    您可以在目标集群HDFS服务的状态页面,单击ZKFC组件操作列中的停止

  2. 登录集群,执行以下命令,初始化ZKFC。

    su - hdfs
    hdfs zkfc -formatZK
  3. 在EMR控制台启动ZKFC组件。

    您可以在目标集群HDFS服务的状态页面,单击ZKFC组件操作列中的启动

方案二

  1. 在EMR控制台删除之前的ServiceRPC配置。

    您可以在目标集群HDFS服务的配置页面,在hdfs-site.xml页签,将以下配置项的参数值置为空。

    dfs.namenode.servicerpc-address.hdfs-cluster.nn1
    dfs.namenode.servicerpc-address.hdfs-cluster.nn2
    dfs.namenode.servicerpc-address.hdfs-cluster.nn3 (仅适用Hadoop3)
    
    或
    
    dfs.namenode.servicerpc-address.emr-cluster.nn1
    dfs.namenode.servicerpc-address.emr-cluster.nn2
    dfs.namenode.servicerpc-address.emr-cluster.nn3 (仅适用Hadoop3)

  2. 在EMR控制台重启HDFS。

    您可以在目标集群HDFS服务的状态页面,在右上角选择更多操作 > 重启,来重启HDFS服务。