当前位置:   article > 正文

Hadoopx3 HA高可用超详细搭建_hadoop3 ha

hadoop3 ha

Hadoop HA 高可用

1.1 HA 概述

  1. 所谓 HA(High Availablity),即高可用(7*24 小时不中断服务)。
  2. 实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA。
  3. NameNode 主要在以下两个方面影响 HDFS 集群

NameNode 机器发生意外,如宕机,集群无法使用,指导管理员重启

NameNode 机器需要升级,包括软件,硬件升级,此时集群也将无法使用

​ HDFS HA 功能通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方 式将 NameNode 很快的切换到另外一台机器。

1.2 HDFS-HA 集群搭建

当前HDFS集群的规划

hadoop102hadoop103hadoop04
NameNodeSecondarynamenode
DataNodeDataNodeDataNode

HA 的主要目的是消除 namenode 的单点故障,需要将 hdfs 集群规划成以下模样

hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
DataNodeDataNodeDataNode

1.2.1 HDFS-HA 核心问题

  1. 怎么保证三台 namenode 的数据一致

    a.Fsimage:让一台 nn 生成数据,让其他机器 nn 同步

    b.Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性

  2. 怎么让同时只有一台 nn 是 active,其他所有是 standby 的

    a.手动分配

    b.自动分配

  3. 2nn 在 ha 架构中并不存在,定期合并 fsimage 和 edtis 的活谁来干

    由 standby 的 nn 来干

  4. 如果 nn 真的发生了问题,怎么让其他的 nn 上位干活

    a.手动故障转移

    b.自动故障转移

1.3 HDFS-HA 手动模式

1.3.1 环境准备

(1)修改 IP

(2)修改主机名及主机名和 IP 地址的映射

(3)关闭防火墙

(4)ssh 免密登录

(5)安装 JDK,配置环境变量等

1.3.2 规划集群

hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode

1.3.3 配置 HDFS-HA 集群

  1. 官方地址:http://hadoop.apache.org/

  2. 在opt目录下创建一个ha文件夹

    [ma@hadoop102 ~]$ cd /opt
    [ma@hadoop102 opt]$ sudo mkdir ha
    [ma@hadoop102 opt]$ sudo chown ma:ma /opt/ha
    
    • 1
    • 2
    • 3
  3. 重新解压hadoop-3.1.3 到/opt/ha

  4. 配置core-site.xml

    <configuration>
    <!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->
     <property>
     <name>fs.defaultFS</name>
     <value>hdfs://mycluster</value>
     </property>
    <!-- 指定 hadoop 运行时产生文件的存储目录 -->
     <property>
     <name>hadoop.tmp.dir</name>
     <value>/opt/ha/hadoop-3.1.3/data</value>
     </property>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  5. 配置hdfs-site.xml

    <configuration>
    <!-- NameNode 数据存储目录 -->
     <property>
     <name>dfs.namenode.name.dir</name>
     <value>file://${hadoop.tmp.dir}/name</value>
     </property>
    <!-- DataNode 数据存储目录 -->
     <property>
     <name>dfs.datanode.data.dir</name>
     <value>file://${hadoop.tmp.dir}/data</value>
     </property>
    <!-- JournalNode 数据存储目录 -->
     <property>
     <name>dfs.journalnode.edits.dir</name>
     <value>${hadoop.tmp.dir}/jn</value>
     </property>
    <!-- 完全分布式集群名称 -->
     <property>
     <name>dfs.nameservices</name>
     <value>mycluster</value>
     </property>
    <!-- 集群中 NameNode 节点都有哪些 -->
     <property>
     <name>dfs.ha.namenodes.mycluster</name>
     <value>nn1,nn2,nn3</value>
     </property>
    <!-- NameNode 的 RPC 通信地址 -->
     <property>
     <name>dfs.namenode.rpc-address.mycluster.nn1</name>
     <value>hadoop102:8020</value>
     </property>
     <property>
     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
     <value>hadoop103:8020</value>
     </property>
        <property>
     <name>dfs.namenode.rpc-address.mycluster.nn3</name>
     <value>hadoop104:8020</value>
     </property>
    <!-- NameNode 的 http 通信地址 -->
     <property>
     <name>dfs.namenode.http-address.mycluster.nn1</name>
     <value>hadoop102:9870</value>
     </property>
     <property>
     <name>dfs.namenode.http-address.mycluster.nn2</name>
     <value>hadoop103:9870</value>
     </property>
     <property>
     <name>dfs.namenode.http-address.mycluster.nn3</name>
     <value>hadoop104:9870</value>
     </property>
    <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
     <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/myclus
    ter</value>
     </property>
    <!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
     <property>
     <name>dfs.client.failover.proxy.provider.mycluster</name>
    
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyP
    rovider</value>
     </property>
    <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
     <property>
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
     </property>
    <!-- 使用隔离机制时需要 ssh 秘钥登录  下面的路径改成自己的-->
     <property>
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/home/atguigu/.ssh/id_rsa</value>
     </property>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  6. 分发配置好的hadoop环境到其他节点

1.3.4 启动 HDFS-HA 集群

  1. 配置hadoop环境变量 记得source一下

  2. 在各个JournalNode节点上,输入一下命令启动iournalnode服务

    [ma@hadoop102 ~]$ hdfs --daemon start journalnode
    [ma@hadoop103 ~]$ hdfs --daemon start journalnode
    [ma@hadoop104 ~]$ hdfs --daemon start journalnode
    
    • 1
    • 2
    • 3
  3. 在 nn1 上,对其进行格式化,并启动

    hdfs namenode -format
    hdfs --daemon start namenode	
    
    • 1
    • 2
  4. 在 nn1 和 nn3 ,同步nn1 的元数据信息

    [ma@hadoop103 ~]$ hdfs namenode -bootstrapStandby
    [ma@hadoop104 ~]$ hdfs namenode -bootstrapStandby
    
    • 1
    • 2
  5. 启动 nn2 和 nn3

    [ma@hadoop103 ~]$ hdfs --daemon start namenode
    [ma@hadoop104 ~]$ hdfs --daemon start namenode
    
    • 1
    • 2
  6. 查看web界面

    图 hadoop102(standby)

    图 hadoop103(standby)

    图 hadoop104(standby)

  7. 在所有节点,自动datanode

    [ma@hadoop102 ~]$ hdfs --daemon start datanode
    [ma@hadoop103 ~]$ hdfs --daemon start datanode
    [ma@hadoop104 ~]$ hdfs --daemon start datanode
    
    • 1
    • 2
    • 3
  8. 将 nn1 切换为 Active

    [ma@hadoop102 ~]$ hdfs haadmin -transitionToActive nn1
    
    • 1
  9. 查看是否Active

    [ma@hadoop102 ~]$ hdfs haadmin -getServiceState nn1
    
    • 1

1.4 HDFS-HA 自动模式

1.4.1 HDFS-HA 自动故障转移工作机制

​ 自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController (ZKFC)进程,如图所示。ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变 和监视客户端故障的高可用服务。

1.4.2 HDFS-HA 自动故障转移的集群规划

hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZookeeperZookeeperZookeeper
ZKFCZKFCZKFC

1.4.3 配置 HDFS-HA 自动故障转移

具体配置
  1. 在hdfs-site.xml中增加

    <!-- 启用 nn 故障自动转移 -->
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
  2. 在core-site.xml文件中增加

    <!-- 指定 zkfc 要连接的 zkServer 地址 -->
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
  3. 分发配置文件

    scp -r hadoop/ root@hadoop103:/opt/module
    
    • 1
启动
  1. 关闭所有hdfs服务

    stop-dfs.sh
    
    • 1
  2. 启动Zookeeper集群

    zkServer.sh start
    
    • 1
  3. 启动Zookeeper以后,再然后初始化HA在Zookeeper 中的状态:

    [ma@hadoop102 ~]$ hdfs zkfc -formatZK
    
    • 1
  4. 启动hdfs 服务

    [ma@hadoop102 ~]$ start-dfs.sh
    
    • 1
  5. 可以去 zkCli.sh 客户端查看 Namenode 选举锁节点内容:

      [zk: localhost:2181(CONNECTED) 7] get -s
      /hadoop-ha/mycluster/ActiveStandbyElectorLock
      
      			-->>
      myclusternn2 hadoop103 �>(�>
      cZxid = 0x10000000b
      ctime = Tue Jul 14 17:00:13 CST 2020
      mZxid = 0x10000000b
      mtime = Tue Jul 14 17:00:13 CST 2020
      pZxid = 0x10000000b
      cversion = 0
      dataVersion = 0
      aclVersion = 0
      ephemeralOwner = 0x40000da2eb70000
      dataLength = 33
      numChildren = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
验证

将 Active NameNode 进程 kill,查看网页端三台 Namenode 的状态变化

kill -9 namenode 的进程 id

1.5 YARN-HA 配置

1.5.1 YARN-HA 工作机制

1)官方文档:

http://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2)YARN-HA 工作机制

Active ResourceManager ---->>> Standby ResourceManager

​ ↓|↓

​ ↓|↓

​ ┍ ┑

​ Zookeeper&Zookeeper&Zookeeper

​ ┕ ┙

也依赖于zookeeper 集群,我们可以启动多个ResourceManager,谁先启动谁就到zk中注册一个临时节点,后启动也会去尝试这个操作,发现已经有注册的了。

所以只能作为Standby ,但是 所有的Standby节点都会去维护一个长轮询,查看这个节点是否存在,如果发现不存在了,立马自己注册节点

1.5.2 配置 YARN-HA 集群

  1. 环境准备

    1. 修改 IP
    2. 修改主机名及主机名和 IP 地址的映射
    3. 关闭防火墙
    4. ssh 免密登录
    5. 安装 JDK,配置环境变量等
    6. 配置 Zookeeper 集群
  2. 规划集群

    hadoop102hadoop103hadoop104
    ResourceManagerResourceManagerResourceManager
    NodeManagerNodeManagerNodeManager
    ZookeeperZookeeperZookeeper
  3. 核心问题

    如果当前 active rm 挂了,其他 rm 怎么将其他 standby rm 上位

    ​ 核心原理跟 hdfs 一样,利用了 zk 的临时节点

    当前 rm 上有很多的计算程序在等待运行,其他的 rm 怎么将这些程序接手过来接着跑

    ​ rm 会将当前的所有计算程序的状态存储在 zk 中,其他 rm 上位后会去读取,然后接着跑

  4. 具体配置

    yarn-site.xml

    <configuration>
     <property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
     </property>
     <!-- 启用 resourcemanager ha -->
     <property>
     <name>yarn.resourcemanager.ha.enabled</name>
     <value>true</value>
     </property>
     <!-- 声明两台 resourcemanager 的地址 -->
     <property>
     <name>yarn.resourcemanager.cluster-id</name>
     <value>cluster-yarn1</value>
     </property>
     <!--指定 resourcemanager 的逻辑列表-->
     <property>
     <name>yarn.resourcemanager.ha.rm-ids</name>
     <value>rm1,rm2,rm3</value>
    </property>
    <!-- ========== rm1 的配置 ========== -->
    <!-- 指定 rm1 的主机名 -->
     <property>
     <name>yarn.resourcemanager.hostname.rm1</name>
     <value>hadoop102</value>
    </property>
    <!-- 指定 rm1 的 web 端地址 -->
    <property>
     <name>yarn.resourcemanager.webapp.address.rm1</name>
     <value>hadoop102:8088</value>
    </property>
    <!-- 指定 rm1 的内部通信地址 -->
    <property>
     <name>yarn.resourcemanager.address.rm1</name>
     <value>hadoop102:8032</value>
    </property>
    <!-- 指定 AM 向 rm1 申请资源的地址 -->
    <property>
     <name>yarn.resourcemanager.scheduler.address.rm1</name>
     <value>hadoop102:8030</value>
    </property>
    <!-- 指定供 NM 连接的地址 -->
    <property>
     <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
     <value>hadoop102:8031</value>
    </property>
    <!-- ========== rm2 的配置 ========== -->
     <!-- 指定 rm2 的主机名 -->
     <property>
     <name>yarn.resourcemanager.hostname.rm2</name>
     <value>hadoop103</value>
    </property>
    <property>
     <name>yarn.resourcemanager.webapp.address.rm2</name>
     <value>hadoop103:8088</value>
    </property>
    <property>
     <name>yarn.resourcemanager.address.rm2</name>
     <value>hadoop103:8032</value>
    </property>
    <property>
     <name>yarn.resourcemanager.scheduler.address.rm2</name>
     <value>hadoop103:8030</value>
    </property>
    <property>
     <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
     <value>hadoop103:8031</value>
    </property>
    <!-- ========== rm3 的配置 ========== -->
    <!-- 指定 rm1 的主机名 -->
     <property>
     <name>yarn.resourcemanager.hostname.rm3</name>
     <value>hadoop104</value>
    </property>
    <!-- 指定 rm1 的 web 端地址 -->
    <property>
     <name>yarn.resourcemanager.webapp.address.rm3</name>
     <value>hadoop104:8088</value>
    </property>
    <!-- 指定 rm1 的内部通信地址 -->
    <property>
     <name>yarn.resourcemanager.address.rm3</name>
     <value>hadoop104:8032</value>
    </property>
    <!-- 指定 AM 向 rm1 申请资源的地址 -->
    <property>
     <name>yarn.resourcemanager.scheduler.address.rm3</name>
     <value>hadoop104:8030</value>
    </property>
    <!-- 指定供 NM 连接的地址 -->
    <property>
     <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
     <value>hadoop104:8031</value>
    </property>
     <!-- 指定 zookeeper 集群的地址 -->
     <property>
     <name>yarn.resourcemanager.zk-address</name>
     <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
     </property>
     <!-- 启用自动恢复 -->
     <property>
     <name>yarn.resourcemanager.recovery.enabled</name>
     <value>true</value>
     </property>
     <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
     <property>
     <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateSt
    ore</value>
    </property>
    <!-- 环境变量的继承 -->
    <property>
     <name>yarn.nodemanager.env-whitelist</name>
    
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS
    SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
     </property>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118

    同步更新其他节点的配置信息,分发配置文件

  5. 启动yarn

    • 在hadoop102或者hadoop103中执行:

      start-yarn.sh

    • 查看服务状态

      yarn rmadmin -getServiceState rm1

    • 可以去 zkCli.sh 客户端查看 ResourceManager 选举锁节点内容

      [ma@hadoop102 ~]$ zkCli.sh
      [zk: localhost:2181(CONNECTED) 16] get -s
      /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock
      
      cluster-yarn1rm1
      cZxid = 0x100000022
      ctime = Tue Jul 14 17:06:44 CST 2020
      mZxid = 0x100000022
      mtime = Tue Jul 14 17:06:44 CST 2020
      pZxid = 0x100000022
      cversion = 0
      dataVersion = 0
      aclVersion = 0
      ephemeralOwner = 0x30000da33080005
      dataLength = 20
      numChildren = 0
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    • web 端查看 hadoop102:8088 和 hadoop103:8088 的 YARN 的状态

      hadoop:8088

1.6 HADOOP HA 的最终规划

Hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZookeeperZookeeperZookeeper
ZKFCZKFCZKFC
ResourceManagerResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

的状态

 hadoop:8088
  • 1

1.6 HADOOP HA 的最终规划

Hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZookeeperZookeeperZookeeper
ZKFCZKFCZKFC
ResourceManagerResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/855681
推荐阅读
相关标签
  

闽ICP备14008679号