7.1 Zookeeper 与 Hadoop


文档摘要

7.1 Zookeeper 与 Hadoop 第七章:Zookeeper 与其他分布式系统 7.1 Zookeeper 与 Hadoop Hadoop 作为大数据处理领域的基石,其核心组件 HDFS 和 YARN 构成了强大的分布式存储和计算平台。然而,随着 Hadoop 集群规模的扩大和应用场景的复杂化,其自身的一些局限性也逐渐显现,尤其是在高可用性(High Availability, HA)、配置管理和分布式协调方面。Zookeeper 的引入,恰好弥补了 Hadoop 在这些方面的不足,极大地增强了 Hadoop 集群的健壮性和可管理性。 7.1.

7.1 Zookeeper 与 Hadoop

第七章:Zookeeper 与其他分布式系统

7.1 Zookeeper 与 Hadoop

Hadoop 作为大数据处理领域的基石,其核心组件 HDFS 和 YARN 构成了强大的分布式存储和计算平台。然而,随着 Hadoop 集群规模的扩大和应用场景的复杂化,其自身的一些局限性也逐渐显现,尤其是在高可用性(High Availability, HA)、配置管理和分布式协调方面。Zookeeper 的引入,恰好弥补了 Hadoop 在这些方面的不足,极大地增强了 Hadoop 集群的健壮性和可管理性。

7.1.1 Zookeeper 在 Hadoop 中的核心作用

Zookeeper 是一个开源的分布式协调服务,它为分布式应用提供一致性、可用性和顺序性保证。在 Hadoop 生态系统中,Zookeeper 主要扮演以下几个核心角色:

  1. 高可用性(HA)解决方案: Zookeeper 是实现 Hadoop 核心组件(如 HDFS NameNode 和 YARN ResourceManager)高可用性的关键组件。通过 Zookeeper,可以实现主备节点的自动切换和故障转移,确保 Hadoop 集群在部分节点故障时仍能持续稳定运行。

  2. 配置管理: Zookeeper 可以作为集中式的配置管理中心,存储和管理 Hadoop 集群的配置信息。各个 Hadoop 组件可以从 Zookeeper 获取最新的配置,实现动态配置更新和集群配置的一致性。

  3. 分布式协调与同步: Zookeeper 提供了分布式锁、领导者选举、队列等原语,可以用于实现 Hadoop 集群内部组件之间的协调和同步,例如 NameNode 的脑裂防止、ResourceManager 的状态同步等。

  4. 集群管理: Zookeeper 可以用于监控 Hadoop 集群的状态,例如节点存活状态、服务运行状态等。通过 Zookeeper 的监控机制,可以及时发现集群中的异常情况,并进行相应的处理。

7.1.2 HDFS NameNode 的高可用性(HA)

在 Hadoop 2.0 之前,HDFS 的 NameNode 存在单点故障问题。一旦 NameNode 发生故障,整个 HDFS 集群将不可用。为了解决这个问题,Hadoop 引入了基于 Zookeeper 的 NameNode HA 方案。

7.1.2.1 NameNode HA 架构

基于 Zookeeper 的 NameNode HA 架构通常包含以下组件:

  • Active NameNode: 负责处理客户端的读写请求,维护 HDFS 的元数据信息。

  • Standby NameNode: 处于备用状态,与 Active NameNode 保持元数据同步,当 Active NameNode 发生故障时,Standby NameNode 可以快速切换为 Active 状态。

  • Shared Storage: 共享存储系统,用于存储 NameNode 的编辑日志(EditLog)。Active NameNode 将编辑日志写入共享存储,Standby NameNode 从共享存储读取编辑日志并回放,从而实现元数据的同步。常用的共享存储方案包括 NFS 和 Quorum Journal Manager (QJM)。

  • Zookeeper 集群: 负责监控 Active NameNode 的健康状态,并在 Active NameNode 故障时进行领导者选举,自动将 Standby NameNode 切换为 Active 状态。

  • ZKFailoverController (ZKFC): 每个 NameNode 节点都运行一个 ZKFC 进程。ZKFC 负责监控本地 NameNode 的健康状态,并与 Zookeeper 集群交互,参与领导者选举和故障转移过程。

图 7.1.2.1 NameNode HA 架构图

7.1.2.2 NameNode HA 工作流程

  1. 启动阶段:

    • 两个 NameNode 启动,ZKFC 也随之启动。

    • ZKFC 向 Zookeeper 集群注册,并尝试竞争成为 Active NameNode。

    • Zookeeper 集群进行领导者选举,选举出一个 ZKFC 成为 Leader。

    • Leader ZKFC 将其对应的 NameNode 切换为 Active 状态,另一个 NameNode 保持 Standby 状态。

    • Active NameNode 开始对外提供服务,并将编辑日志写入共享存储。

    • Standby NameNode 从共享存储读取编辑日志并回放,与 Active NameNode 保持元数据同步。

  2. 正常运行阶段:

    • Active NameNode 持续对外提供服务,并将编辑日志写入共享存储。

    • Standby NameNode 持续从共享存储读取编辑日志并回放,保持元数据同步。

    • ZKFC 定期向 Zookeeper 集群发送心跳,表明 NameNode 处于健康状态。

  3. 故障转移阶段:

    • 当 Active NameNode 发生故障(例如宕机、进程崩溃)时,其对应的 ZKFC 无法再向 Zookeeper 集群发送心跳。

    • Zookeeper 集群检测到 Active NameNode 的 ZKFC 失联,认为 Active NameNode 发生故障。

    • Zookeeper 集群触发领导者选举,从剩余的 ZKFC 中选举出一个新的 Leader。

    • 新的 Leader ZKFC 将其对应的 Standby NameNode 切换为 Active 状态。

    • 原 Standby NameNode 切换为 Active 状态后,开始对外提供服务,并接管原 Active NameNode 的工作。

    • 客户端请求被重定向到新的 Active NameNode,HDFS 服务恢复正常。

7.1.2.3 NameNode HA 配置实践

要启用 NameNode HA,需要在 Hadoop 的配置文件中进行相应的配置。以下是一些关键的配置项,以 hdfs-site.xml 为例:

<configuration> <!-- 指定 NameService ID,用于区分不同的 HA 集群 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 指定 NameNode 的逻辑名称,与 dfs.nameservices 对应 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- 指定 NameNode nn1 的 RPC 地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>namenode1.example.com:8020</value> </property> <!-- 指定 NameNode nn1 的 HTTP 地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>namenode1.example.com:9870</value> </property> <!-- 指定 NameNode nn2 的 RPC 地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>namenode2.example.com:8020</value> </property> <!-- 指定 NameNode nn2 的 HTTP 地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>namenode2.example.com:9870</value> </property> <!-- 指定共享编辑日志存储方案为 Quorum Journal Manager (QJM) --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value> </property> <!-- 启用自动故障转移,并指定 Zookeeper 集群地址 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node1.example.com:2181,node2.example.com:2181,node3.example.com:2181</value> </property> </configuration>

配置详解:

  • dfs.nameservices: 定义 NameService ID,用于逻辑上区分不同的 HA 集群。在一个物理集群中可以配置多个 NameService,每个 NameService 可以是一个 HA 集群或非 HA 集群。

  • dfs.ha.namenodes.mycluster: 指定 NameService ID 为 mycluster 的 HA 集群包含的 NameNode 逻辑名称,这里配置了 nn1nn2

  • dfs.namenode.rpc-address.mycluster.nn1, dfs.namenode.http-address.mycluster.nn1, dfs.namenode.rpc-address.mycluster.nn2, dfs.namenode.http-address.mycluster.nn2: 分别配置了 nn1nn2 这两个 NameNode 的 RPC 和 HTTP 访问地址。客户端通过这些地址与 NameNode 进行通信。

  • dfs.namenode.shared.edits.dir: 指定共享编辑日志的存储方案。这里配置了 qjournal,表示使用 Quorum Journal Manager。qjournal://... 后面跟的是 QJM 集群的地址和 NameService ID。

  • dfs.ha.automatic-failover.enabled: 启用自动故障转移功能。设置为 true 后,ZKFC 将自动进行故障检测和转移。

  • ha.zookeeper.quorum: 指定 Zookeeper 集群的地址列表,ZKFC 需要连接到这些 Zookeeper 节点进行协调和领导者选举。

7.1.2.4 启动 NameNode HA 集群

配置完成后,需要按照以下步骤启动 NameNode HA 集群:

  1. 启动 Zookeeper 集群: 确保 Zookeeper 集群已经正确启动并运行。

  2. 启动 JournalNode: 如果使用 QJM 作为共享存储,需要在配置的 JournalNode 节点上启动 JournalNode 服务。

    hadoop-daemon.sh start journalnode
  3. 格式化 NameNode (仅首次启动时需要): 在 一个 NameNode 节点上执行格式化操作,并指定 NameService ID。

    hdfs namenode -format mycluster
  4. 启动 NameNode: 在 两个 NameNode 节点上分别启动 NameNode 服务。

    hadoop-daemon.sh start namenode
  5. 启动 ZKFailoverController: 在 两个 NameNode 节点上分别启动 ZKFailoverController 服务。

    hadoop-daemon.sh start zkfc

启动完成后,可以通过 Web UI 或命令行工具查看 NameNode 的状态,确认 HA 集群是否正常运行。可以使用 hdfs haadmin -getServiceState <namenode_id> 命令查看指定 NameNode 的状态 (active 或 standby)。

7.1.3 YARN ResourceManager 的高可用性(HA)

类似于 HDFS NameNode,YARN ResourceManager 也存在单点故障问题。Zookeeper 同样可以用于实现 ResourceManager 的 HA。

7.1.3.1 ResourceManager HA 架构

ResourceManager HA 架构与 NameNode HA 架构类似,也包含 Active ResourceManager 和 Standby ResourceManager,并通过 Zookeeper 进行协调和故障转移。

图 7.1.3.1 ResourceManager HA 架构图

7.1.3.2 ResourceManager HA 工作流程

ResourceManager HA 的工作流程与 NameNode HA 类似:

  1. 启动阶段: 两个 ResourceManager 启动,RMZKFC 也随之启动,通过 Zookeeper 进行领导者选举,选举出一个 Active ResourceManager 和一个 Standby ResourceManager。

  2. 正常运行阶段: Active ResourceManager 负责资源调度和作业管理,并将状态信息(如 ApplicationMaster 信息、NodeManager 信息)存储到共享状态存储系统中(例如 State Store in Zookeeper 或其他外部存储)。Standby ResourceManager 从共享状态存储系统中同步状态信息。

  3. 故障转移阶段: 当 Active ResourceManager 发生故障时,Zookeeper 触发故障转移,将 Standby ResourceManager 切换为 Active 状态。新的 Active ResourceManager 从共享状态存储系统中恢复状态信息,并继续处理未完成的作业和新的作业请求。

7.1.3.3 ResourceManager HA 配置实践

ResourceManager HA 的配置主要在 yarn-site.xml 文件中进行:

<configuration> <!-- 启用 ResourceManager HA --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定 ResourceManager 的 NameService ID --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-cluster</value> </property> <!-- 指定 ResourceManager 的逻辑名称 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 指定 ResourceManager rm1 的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>resourcemanager1.example.com</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>resourcemanager1.example.com:8088</value> </property> <!-- 指定 ResourceManager rm2 的地址 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>resourcemanager2.example.com</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>resourcemanager2.example.com:8088</value> </property> <!-- 配置 ResourceManager 状态存储方案为 Zookeeper --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1.example.com:2181,node2.example.com:2181,node3.example.com:2181</value> </property> </configuration>

配置详解:

  • yarn.resourcemanager.ha.enabled: 启用 ResourceManager HA 功能。

  • yarn.resourcemanager.cluster-id: 定义 ResourceManager 集群 ID,用于区分不同的 YARN 集群。

  • yarn.resourcemanager.ha.rm-ids: 指定 ResourceManager HA 集群包含的 ResourceManager 逻辑名称,这里配置了 rm1rm2

  • yarn.resourcemanager.hostname.rm1, yarn.resourcemanager.webapp.address.rm1, yarn.resourcemanager.hostname.rm2, yarn.resourcemanager.webapp.address.rm2: 分别配置了 rm1rm2 这两个 ResourceManager 的主机名和 Web UI 地址。

  • yarn.resourcemanager.store.class: 指定 ResourceManager 状态存储方案。这里配置为 ZKRMStateStore,表示使用 Zookeeper 存储 ResourceManager 的状态信息。

  • yarn.resourcemanager.zk-address: 指定 Zookeeper 集群的地址列表,ResourceManager 需要连接到这些 Zookeeper 节点进行状态存储和 HA 协调。

7.1.3.4 启动 ResourceManager HA 集群

配置完成后,需要按照以下步骤启动 ResourceManager HA 集群:

  1. 启动 Zookeeper 集群: 确保 Zookeeper 集群已经正确启动并运行。

  2. 启动 ResourceManager: 在 两个 ResourceManager 节点上分别启动 ResourceManager 服务。

    yarn-daemon.sh start resourcemanager

启动完成后,可以通过 Web UI 或命令行工具查看 ResourceManager 的状态,确认 HA 集群是否正常运行。

7.1.4 Zookeeper 在 Hadoop 其他组件中的应用

除了 NameNode 和 ResourceManager HA,Zookeeper 在 Hadoop 生态系统的其他组件中也有应用,例如:

  • HBase: HBase 使用 Zookeeper 进行 Master 选举、RegionServer 注册和监控、元数据管理等。Zookeeper 是 HBase 运行的关键依赖组件。

  • Kafka: Kafka 使用 Zookeeper 进行 Broker 注册、Topic 管理、Partition Leader 选举等。虽然新版本的 Kafka 正在尝试移除 Zookeeper 依赖,但在很多生产环境中,Zookeeper 仍然是 Kafka 的重要组成部分。

  • Spark: Spark Standalone 模式可以使用 Zookeeper 进行 Master HA 选举。Spark on YARN 模式则依赖 YARN 的 ResourceManager HA,间接使用了 Zookeeper。

7.1.5 总结

Zookeeper 在 Hadoop 生态系统中扮演着至关重要的角色,尤其是在高可用性方面。通过 Zookeeper,Hadoop 核心组件 NameNode 和 ResourceManager 能够实现自动故障转移,极大地提高了 Hadoop 集群的可靠性和稳定性。此外,Zookeeper 还为 Hadoop 提供了配置管理、分布式协调和集群管理等功能,增强了 Hadoop 集群的可管理性和扩展性。在构建高可用、高性能的 Hadoop 集群时,Zookeeper 是不可或缺的关键组件。

代码实践总结:

本文中提供的代码实践主要集中在 Hadoop 配置文件的修改上,展示了如何配置 hdfs-site.xmlyarn-site.xml 来启用 NameNode HA 和 ResourceManager HA,并指定 Zookeeper 集群的地址和相关参数。这些配置实践是构建基于 Zookeeper 的 Hadoop HA 集群的基础。在实际操作中,需要根据具体的环境和需求进行调整和完善。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U