Hadoop - HA学习笔记
阅读原文时间:2023年07月09日阅读:3

Hadoop HA概述

工作要点

  • 通过双NameNode消除单点故障
  • 元数据管理方式需要改变:内存中各自保存一份元数据;Edits 日志只有 Active 状态的NameNode节点可以做写操作;两个
    NameNode都可以读取 Edits;共享的Edits放在一个共享存储中管理(qjournal 和 NFS 两个主流实现);
  • 需要一个状态管理功能模块:实现了一个zkfailover ,常驻在每一个 NameNode 所在的节点,每一个 zkfailover 负责监
    控自己所在NameNode节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover来负责切换,切换时需要防止 brain split 现象的发生。
  • 必须保证两个 NameNode 之间能够 ssh 无密码登录;
  • 隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务

HDSF HA自动故障转移机制

  • 使用两个新组件:ZooKeeper,ZKFailoverController(zkfc)进程
  • HA依赖于ZooKeeper的以下功能:
    • Failure detection,故障检测:集群中的每个 NameNode 在 ZooKe eper 中维护了一个持久会话,如果机器崩溃, ZooKeeper 中的会话将终止, ZooKeeper 通知另一个 NameNode 需要触发故障转移。
    • Active NameNode election,现役NameNode选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。
  • zkfc是ZooKeeper的客户端,监视和管理NameNode的状态,每个NameNode运行一个akfc进程,负责:
    • Health monitoring,健康检测:使用一个健康检测命令定期的ping与与之在相同主机的NameNode,只要NameNode及时的回复健康状态,zkfc则认为改节点是健康的,认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
    • ZooKeeper session management ,ZooKeeper会话管理:当本地 NameNode是健康的, ZKFC保持一个在 ZooKeeper中打开的会话。如果本地 NameNode 处于 active 状态, ZKFC也保持一个特殊的 znode 锁,该锁使用了 ZooKeeper 对短暂 节点的支持,如果会话终止,锁节点将自动删除。
    • ZooKeeper-based election,基于 ZooKeeper 的选择: 如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的
      节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 A ctive 。故障转移 进程 与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode ,然后本地 NameNode 转换为 Active 状态。

HDFS HA配置

集群规划

localhost102

localhost103

localhost104

NameNode

NameNode

 

JournalNode

JournalNode

JournalNode

DataNode

DataNode

DataNode

ZK

ZK

ZK

ResourceManager

ResourceManager

 

NodeManager

NodeManager

NodeManager

配置ZooKeeper集群

  • 解压,创建zkData目录,添加myid文件
  • 修改conf/zoo.cfg,添加集群信息server.A=B:C:D,A是节点myid,B是主机名,C是通信端口2888,D是选举端口3888
  • 启动集群:bin/zkServer.sh start,启动客户端:bin/zkCli.sh

配置HDFS HA集群(手动故障转移)

  • 配置core-site.xml

            fs.defaultFS         hdfs://mycluster

            hadoop.tmp.dir         /opt/module/HA/hadoop-2.7.2/data/tmp

            dfs.journalnode.edits.dir         /opt/module/HA/hadoop-2.7.2/data/tmp/jn

  • 配置hdfs-site.xml

    dfs.nameservices mycluster

    dfs.ha.namenodes.mycluster nn1,nn2

    dfs.namenode.rpc-address.mycluster.nn1 localhost102:8020

    dfs.namenode.rpc-address.mycluster.nn2 localhost103:8020

    dfs.namenode.http-address.mycluster.nn1 localhost102:50070

    dfs.namenode.http-address.mycluster.nn2 localhost103:50070

    dfs.namenode.shared.edits.dir qjournal://localhost102:8485;localhost103:8485;localhost104:8485/mycluster

    dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    dfs.ha.fencing.methods sshfence

    dfs.ha.fencing.ssh.private-key-files /home/shun/.ssh/id_rsa

    dfs.permissions.enable false

  • 启动所有的JournalNode:sbin/hadoop-daemons.sh start journalnodes

  • 在nn1上格式化并启动:bin/hdfs namenode -format,启动sbin/hadoop-daemon.sh start namenode

  • 在nn2上同步nn1的信息并启动:bin/hdfs namenode -bootstrapStandby,启动:sbin/hadoop-daemon.sh start namenode

  • 将nn1或nn2切换成Active状态:启动所有DataNode:sbin/hadoop-daemons.sh start datanode,切换为Active:bin/hdfs haadmin -transitionToActive nn1,查看状态:bin/hdfs haadmin -getServiceState nn1

配置HDFS HA自动故障转移

  • 关闭所有HDFS服务:sbin/stop-dfs.sh

  • 启动ZooKeeper集群:ZooKeeper目录下:bin/zkServer.sh start

  • 配置core-site.xml,ZK地址

            ha.zookeeper.quorum         localhost102:2181,localhost103:2181,localhost104:2181

  • 配置hdfs-site.xml,开启自动故障转移

    dfs.ha.automatic-failover.enabled true

  • 初始化HA在ZK中的状态:bin/hdfs zkfc -formatZK

  • 启动HDFS服务:sbin/start-dfs.sh

注意:第一次使用集群时,必须先不打开自动故障转移;启动所有的JournalNode,格式化其中一个NameNode,然后启动,再在另一个NameNode上同步前一个NameNode的信息,开启这个NameNode。然后关闭所有HDFS服务,配置ZK地址、开启自动故障转移,再格式化zkfc,开启所有HDFS服务即可。

nn1和nn2的端口可以是1版本的8020,也可以是9000

YARN HA配置

  • 工作机制

  • 配置yarn-site.xml,启用HA,声明集群名,两个rm的命名,声明两个rm的地址,ZK地址

    yarn.nodemanager.aux-services mapreduce_shuffle

    yarn.log-aggregation-enable true

    yarn.log-aggregation.retain-seconds 604800

    yarn.nodemanager.aux-services mapreduce_shuffle

    yarn.resourcemanager.ha.enabled true

    yarn.resourcemanager.cluster-id cluster-yarn1

    yarn.resourcemanager.ha.rm-ids rm1,rm2

    yarn.resourcemanager.hostname.rm1 localhost102

    yarn.resourcemanager.hostname.rm2 localhost103

    yarn.resourcemanager.zk-address localhost102:2181,localhost103:2181,localhost104:2181

  • 在rm1上开启所有YARN服务:sbin/start-yarn.sh(不会开启rm2的resourcemanager)

  • 在rm2上开启resourcemanager:sbin/yarn-daemon.sh start resourcemanager

注意:

sbin/start-yarn.sh只开启本地的resourcemanager和所有的nodemanager,需要在两一个节点开启resourcemanager;

sbin/start-hdfs.sh开启所有节点的DataNode、NameNode、JournalNode、zkfc;

开启/关闭所有节点的单个HDFS进程:sbin/hadoop-daemons.sh start/stop namenode/datanode/journalnode/zkfc

开启/关闭所有节点的单个YARN进程:sbin/yarn-daemons.sh start/stop resourcemanager/nodemanager

单节点启动:sbin/hadoop-daemon.sh,sbin/yarn-daemon.sh