Apache ZooKeeper 服务器无法在 Azure HDInsight 中形成仲裁

本文介绍与 Azure HDInsight 群集中的 Zookeeper 相关的问题的故障排除步骤和可能的解决方案。

症状

  • 两个资源管理器都进入备用模式
  • 两个名称节点都处于备用模式
  • 由于 Zookeeper 连接失败,Spark、Hive 和 Yarn 作业失败,或 Hive 查询失败
  • LLAP 守护程序无法在安全 Spark 或安全交互式 Hive 群集上启动

示例日志

可能会看到与 yarn 日志类似的错误消息(头节点上的 /var/log/hadoop-yarn/yarn/yarn-yarn*.log):

2020-05-05 03:17:18.3916720|Lost contact with Zookeeper. Transitioning to standby in 10000 ms if connection is not reestablished.
Message
2020-05-05 03:17:07.7924490|Received RMFatalEvent of type STATE_STORE_FENCED, caused by org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth
...
2020-05-05 03:17:08.3890350|State store operation failed 
2020-05-05 03:17:08.3890350|Transitioning to standby state
  • Yarn、NameNode 和 Livy 等高可用性服务可能会因为诸多原因停止运行。
  • 通过日志确认它与 Zookeeper 连接有关
  • 确保问题反复发生(如果只是个别情况,请勿使用这些解决方案)
  • 由于 Zookeeper 连接问题,作业可能会暂时失败

Zookeeper 失败的常见原因

  • Zookeeper 服务器上的 CPU 使用率较高
    • 在 Ambari UI 中,如果看到 Zookeeper 服务器上的 CPU 持续使用率接近 100%,则在这段时间内打开的 Zookeeper 会话可能会过期并超时
  • Zookeeper 客户端报告频繁超时
    • 在资源管理器、名称节点等的日志中看到频繁的连接超时
    • 这可能导致仲裁丢失、频繁的故障转移和其他问题

检查 Zookeeper 状态

  • 从 /etc/hosts 文件或 Ambari UI 中找到 Zookeeper 服务器
  • 运行以下命令:
    • echo stat | nc <ZOOKEEPER_HOST_IP> 2181(或 2182)
    • 端口 2181 是 Apache Zookeeper 实例
    • HDInsight Zookeeper 使用端口 2182(为不是本地 HA 的服务提供 HA)
    • 如果命令未显示任何输出,则意味着 Zookeeper 服务器未运行
    • 如果服务器正在运行,则结果将包括客户端连接的静态变量和其他统计信息
Zookeeper version: 3.4.6-8--1, built on 12/05/2019 12:55 GMT
Clients:
 /10.2.0.57:50988[1](queued=0,recved=715,sent=715)
 /10.2.0.57:46632[1](queued=0,recved=138340,sent=138347)
 /10.2.0.34:14688[1](queued=0,recved=264653,sent=353420)
 /10.2.0.52:49680[1](queued=0,recved=134812,sent=134814)
 /10.2.0.57:50614[1](queued=0,recved=19812,sent=19812)
 /10.2.0.56:35034[1](queued=0,recved=2586,sent=2586)
 /10.2.0.52:63982[1](queued=0,recved=72215,sent=72217)
 /10.2.0.57:53024[1](queued=0,recved=19805,sent=19805)
 /10.2.0.57:45126[1](queued=0,recved=19621,sent=19621)
 /10.2.0.56:41270[1](queued=0,recved=1348743,sent=1348788)
 /10.2.0.53:59097[1](queued=0,recved=72215,sent=72217)
 /10.2.0.56:41088[1](queued=0,recved=788,sent=802)
 /10.2.0.34:10246[1](queued=0,recved=19575,sent=19575)
 /10.2.0.56:40944[1](queued=0,recved=717,sent=717)
 /10.2.0.57:45466[1](queued=0,recved=19861,sent=19861)
 /10.2.0.57:59634[0](queued=0,recved=1,sent=0)
 /10.2.0.34:14704[1](queued=0,recved=264622,sent=353355)
 /10.2.0.57:42244[1](queued=0,recved=49245,sent=49248)

Latency min/avg/max: 0/3/14865
Received: 238606078
Sent: 239139381
Connections: 18
Outstanding: 0
Zxid: 0x1004f99be
Mode: follower
Node count: 133212

每小时 CPU 负载达到峰值

  • 登录到 Zookeeper 服务器并检查 /etc/crontab
  • 如果此时有任何每小时作业正在运行,请在不同的 Zookeeper 服务器之间随机分配启动时间。

清除旧快照

  • 将 Zookeeper 配置为自动清除旧快照
  • 默认情况下,保留最近的 30 个快照
  • 保留的快照数量,由配置键 autopurge.snapRetainCount 控制。 可在以下文件中找到此属性:
    • /etc/zookeeper/conf/zoo.cfg(适用于 Hadoop Zookeeper)
    • /etc/hdinsight-zookeeper/conf/zoo.cfg(适用于 HDInsight Zookeeper)
  • autopurge.snapRetainCount 设置为值 3,然后重启 Zookeeper 服务器
    • 可以更新 Hadoop Zookeeper 配置,并且可以通过 Ambari 重启服务
    • 手动停止并重启 HDInsight Zookeeper
      • sudo lsof -i :2182 提供要终止的进程 ID
      • sudo python /opt/startup_scripts/startup_hdinsight_zookeeper.py
  • 请勿手动清除快照 - 手动删除快照可能会导致数据丢失

Zookeeper 服务器日志中的 CancelledKeyException 不需要清理快照

  • 此异常会出现在 zookeeper 服务器(/var/log/zookeeper/zookeeper-zookeeper-* 或 /var/log/hdinsight-zookeeper/zookeeper* 文件)上
  • 此异常通常表示客户端不再处于活动状态,并且服务器无法发送消息
  • 此异常还表示 Zookeeper 客户端过早结束了会话
  • 查找本文档中所述的其他症状

后续步骤

如果你的问题未在本文中列出,或者无法解决问题,请访问以下渠道以获取更多支持:

  • 如果需要更多帮助,可以从 Azure 门户提交支持请求。 从菜单栏中选择“支持” ,或打开“帮助 + 支持” 中心。 有关更多详细信息,请参阅如何创建 Azure 支持请求。 Microsoft Azure 订阅中带有对订阅管理和计费支持的访问权限,技术支持通过 Azure 支持计划之一提供。