• 基于 HBase & Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署


    目录

    一、主机规划

    二、环境准备

    1. 启动 NTP 时钟同步

    2. 修改 hosts 文件

    3. 配置所有主机间 ssh 免密

    4. 修改用户可打开文件数与进程数(可选)

    三、安装 JDK

    四、安装部署 Zookeeper 集群

    1. 解压、配置环境变量

    2. 创建配置文件

    3. 创建新的空 ZooKeeper 数据目录和事务日志目录

    4. 添加 myid 配置

    5. 设置 Zookeeper 使用的 JVM 堆内存

    6. 启动 ZooKeeper

    7. 查看 ZooKeeper 状态

    8. 简单测试 ZooKeeper 命令

    五、安装配置 Hadoop HA 集群

    1. 解压、配置环境变量(node1 执行)

    2. HDFS 高可用配置

    (1)创建存储目录

    (2)修改核心模块配置

    (3)修改 hdfs 文件系统模块配置

    (4)修改 $HADOOP_HOME/etc/hadoop/workers

    3. YARN ResourceManager 高可用配置

    (1)修改 yarn 模块配置

    (2)修改 MapReduce 模块配置

    4. 分发配置文件其它节点

    5. 启动 HDFS 相关服务

    6. 添加环境变量

    7. 启动 YARN 相关服务

    8. 启动 YARN

    9. 启动 MapReduce 任务历史服务

    五、Hadoop HA 测试验证

    1. HDFS NameNode HA 验证

    (1)查看 NameNode 节点状态,任一节点执行

    (2)故障模拟

    (3)查看节点状态,任一节点执行

    (4)故障恢复

    (5)查看节点状态,任一节点执行

    (6)再次测试自动切换

    2. YARN ResourceManager HA 验证

    (1)查看 ResourceManager 节点状态,任一节点执行

    (2)故障模拟

    (3)查看节点状态,任一节点执行

    (4)故障恢复

    (5)查看节点状态,任一节点执行

    (6)再次测试自动切换

    参考:


    一、主机规划

            使用以下四台虚拟机搭建测试环境,保证网络连通,禁用防火墙。

    • IP/主机名:

    172.18.4.126    node1
    172.18.4.188    node2
    172.18.4.71      node3
    172.18.4.86      node4

    • 资源配置:

    CPU:4核超线程;内存:8GB;Swap:4GB;硬盘:200GB。

    • 操作系统:

    CentOS Linux release 7.9.2009 (Core)

    • 所需安装包:

    jdk-8u202
    Zookeeper-3.9.1
    Hadoop-3.3.6

            下表描述了四个节点上分别将会运行的相关进程。简便起见,安装部署过程中所用的命令都使用操作系统的 root 用户执行。

                                  节点

    进程

    node1

    node2

    node3

    node4

    Zookeeper

    *

    *

    *

    NameNode

    *

    *

    DataNode

    *

    *

    *

    ZKFC

    *

    *

    JournalNode

    *

    *

    *

    ResourceManager

    *

    *

    NodeManager

    *

    *

    *

    JobHistoryServer

    *

    二、环境准备

            在全部四台机器执行以下步骤。

    1. 启动 NTP 时钟同步

            略。可参考 Greenplum 6 安装配置详解_greenplum6安装-CSDN博客

    2. 修改 hosts 文件

    1. # 编辑 /etc/hosts 文件
    2. vim /etc/hosts
    3. # 添加主机名
    4. 172.18.4.126    node1
    5. 172.18.4.188    node2
    6. 172.18.4.71     node3
    7. 172.18.4.86     node4

    3. 配置所有主机间 ssh 免密

    1. # 生成秘钥
    2. ssh-keygen
    3. # 复制公钥
    4. ssh-copy-id node1
    5. ssh-copy-id node2
    6. ssh-copy-id node3
    7. ssh-copy-id node4
    8. # 验证
    9. ssh node1 date
    10. ssh node2 date
    11. ssh node3 date
    12. ssh node4 date

    4. 修改用户可打开文件数与进程数(可选)

    1. # 查看
    2. ulimit -a
    3. # 设置,编辑 /etc/security/limits.conf 文件
    4. vim /etc/security/limits.conf
    5. # 添加下面两行
    6. *    soft    nofile    512000
    7. *    hard    nofile    512000

    三、安装 JDK

            分别在 node1 - node4 四台上机器执行:

    1. # 安装
    2. rpm -ivh jdk-8u202-linux-x64.rpm
    3. # 确认版本
    4. java -version

            输出:

    1. [root@vvml-yz-hbase-test~]#java -version
    2. java version "1.8.0_202"
    3. Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
    4. Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
    5. [root@vvml-yz-hbase-test~]#

    四、安装部署 Zookeeper 集群

            分别在 node1 - node3 三台机器执行以下步骤。

    1. 解压、配置环境变量

    1. # 解压
    2. tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz
    3. # 编辑 /etc/profile 文件
    4. vim /etc/profile
    5. # 添加下面两行
    6. export ZOOKEEPER_HOME=/root/apache-zookeeper-3.9.1-bin/
    7. export PATH=$ZOOKEEPER_HOME/bin:$PATH
    8. # 加载生效
    9. source /etc/profile

    2. 创建配置文件

    1. # 备份
    2. cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
    3. vim $ZOOKEEPER_HOME/conf/zoo.cfg
    4. # 编辑 zoo.cfg 文件内容如下:
    5. # ZooKeeper 使用的毫秒为单位的时间单元,用于进行心跳,最小会话超时将是 tickTime 的两倍。
    6. tickTime=2000
    7. # 存储内存中数据库快照的位置。
    8. dataDir=/var/lib/zookeeper/data
    9. # 数据库更新的事务日志所在目录。
    10. dataLogDir=/var/lib/zookeeper/log
    11. # 监听客户端连接的端口。
    12. clientPort=2181
    13. # LF 初始通信时限,即集群中的 follower 服务器(F)与 leader 服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
    14. initLimit=5
    15. # LF 同步通信时限,即集群中的 follower 服务器(F)与 leader 服务器(L)之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
    16. syncLimit=2
    17. # 集群配置 server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口。当服务器启动时,通过在数据目录中查找文件 myid 来知道它是哪台服务器。
    18. server.1=172.18.4.126:2888:3888
    19. server.2=172.18.4.188:2888:3888
    20. server.3=172.18.4.71:2888:3888
    21. # 指定自动清理事务日志和快照文件的频率,单位是小时。 
    22. autopurge.purgeInterval=1

    3. 创建新的空 ZooKeeper 数据目录和事务日志目录

    1. mkdir -p /var/lib/zookeeper/data
    2. mkdir -p /var/lib/zookeeper/log

    4. 添加 myid 配置

    1. # node1
    2. echo 1 > /var/lib/zookeeper/data/myid
    3. # node2
    4. echo 2 > /var/lib/zookeeper/data/myid
    5. # node3
    6. echo 3 > /var/lib/zookeeper/data/myid

    5. 设置 Zookeeper 使用的 JVM 堆内存

    1. vim $ZOOKEEPER_HOME/bin/zkEnv.sh
    2. # 修改 zkEnv.sh 文件中的ZK_SERVER_HEAP值,缺省为1000,单位是MB,修改为2048。
    3. # default heap for zookeeper server
    4. ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-2048}"

    6. 启动 ZooKeeper

    zkServer.sh start

            日志记录在安装目录下的 logs 目录中,如本例中的 /root/apache-zookeeper-3.9.1-bin/logs。用 jps 可以看到 QuorumPeerMain 进程:

    1. [root@vvml-yz-hbase-test~]#jps
    2. 5316 QuorumPeerMain
    3. 5373 Jps
    4. [root@vvml-yz-hbase-test~]#

    7. 查看 ZooKeeper 状态

    zkServer.sh status

            node1 输出:

    1. /usr/bin/java
    2. ZooKeeper JMX enabled by default
    3. Using config: /root/apache-zookeeper-3.9.1-bin/bin/../conf/zoo.cfg
    4. Client port found: 2181. Client address: localhost. Client SSL: false.
    5. Mode: follower

            node2 输出:

    1. /usr/bin/java
    2. ZooKeeper JMX enabled by default
    3. Using config: /root/apache-zookeeper-3.9.1-bin/bin/../conf/zoo.cfg
    4. Client port found: 2181. Client address: localhost. Client SSL: false.
    5. Mode: leader

            node3 输出:

    1. /usr/bin/java
    2. ZooKeeper JMX enabled by default
    3. Using config: /root/apache-zookeeper-3.9.1-bin/bin/../conf/zoo.cfg
    4. Client port found: 2181. Client address: localhost. Client SSL: false.
    5. Mode: follower

            node2 为 leader,node1、node3 为 follower。

    8. 简单测试 ZooKeeper 命令

    1. # 连接ZooKeeper
    2. zkCli.sh -server node1:2181
    3.  
    4. # 控制台输出
    5. /usr/bin/java
    6. Connecting to node1:2181
    7. ...
    8. Welcome to ZooKeeper!
    9. ...
    10. JLine support is enabled
    11. ...
    12. [zk: node1:2181(CONNECTED) 0] help
    13. ZooKeeper -server host:port -client-configuration properties-file cmd args
    14. ...
    15. Command not found: Command not found help
    16. [zk: node1:2181(CONNECTED) 1] ls /
    17. [zookeeper]
    18. [zk: node1:2181(CONNECTED) 2] create /zk_test my_data
    19. Created /zk_test
    20. [zk: node1:2181(CONNECTED) 3] ls /
    21. [zk_test, zookeeper]
    22. [zk: node1:2181(CONNECTED) 4] get /zk_test
    23. my_data
    24. [zk: node1:2181(CONNECTED) 5] set /zk_test junk
    25. [zk: node1:2181(CONNECTED) 6] get /zk_test
    26. junk
    27. [zk: node1:2181(CONNECTED) 7] delete /zk_test
    28. [zk: node1:2181(CONNECTED) 8] ls /
    29. [zookeeper]
    30. [zk: node1:2181(CONNECTED) 9] quit
    31. WATCHER::
    32. WatchedEvent state:Closed type:None path:null zxid: -1
    33. 2024-03-05 10:18:32,189 [myid:] - INFO  [main:o.a.z.ZooKeeper@1232] - Session: 0x100421ce5c90000 closed
    34. 2024-03-05 10:18:32,190 [myid:] - INFO  [main-EventThread:o.a.z.ClientCnxn$EventThread@553] - EventThread shut down for session: 0x100421ce5c90000
    35. 2024-03-05 10:18:32,193 [myid:] - INFO  [main:o.a.z.u.ServiceUtils@45] - Exiting JVM with code 0
    36. [root@vvml-yz-hbase-test~]#

    五、安装配置 Hadoop HA 集群

    1. 解压、配置环境变量(node1 执行)

    1. # 解压
    2. tar -zvxf hadoop-3.3.6.tar.gz
    3. # 编辑 /etc/profile 文件
    4. vim /etc/profile
    5. # 添加如下两行
    6. export HADOOP_HOME=/root/hadoop-3.3.6/
    7. export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    8. # 加载生效
    9. source /etc/profile
    10. # 编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 文件设置 Hadoop 运行环境
    11. vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
    12. # 在文件末尾添加
    13. export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64
    14. export HDFS_NAMENODE_USER=root
    15. export HDFS_DATANODE_USER=root
    16. export HDFS_SECONDARYNAMENODE_USER=root
    17. export YARN_RESOURCEMANAGER_USER=root
    18. export YARN_NODEMANAGER_USER=root
    19. export HADOOP_PID_DIR=/root/hadoop-3.3.6

    2. HDFS 高可用配置

    (1)创建存储目录

    1. mkdir -p $HADOOP_HOME/data/namenode
    2. mkdir -p $HADOOP_HOME/data/journalnode

    (2)修改核心模块配置

    1. # 编辑 $HADOOP_HOME/etc/hadoop/core-site.xml 文件
    2. vim $HADOOP_HOME/etc/hadoop/core-site.xml
    3. # 配置如下
    4. <configuration>
    5.   <!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
    6.   <property>
    7.     <name>fs.defaultFS</name>
    8.     <value>hdfs://mycluster</value>
    9.     <final>true</final>
    10.   </property>
    11.   
    12.   <property>
    13.     <name>io.file.buffer.szie</name>
    14.     <value>131072</value>
    15.   </property>
    16.   <!-- 设置Hadoop本地保存数据路径 -->
    17.   <property>
    18.     <name>hadoop.tmp.dir</name>
    19.     <value>/root/hadoop-3.3.6/data/namenode</value>
    20.   </property>
    21.   <!-- 指定zookeeper地址 -->
    22.   <property>
    23.     <name>ha.zookeeper.quorum</name>
    24.     <value>node1:2181,node2:2181,node3:2181</value>
    25.   </property>
    26.   <!-- 设置HDFS web UI用户身份 -->
    27.   <property>
    28.     <name>hadoop.http.staticuser.user</name>
    29.     <value>root</value>
    30.   </property>
    31.   <!-- 配置该root允许通过代理访问的主机节点 -->
    32.   <property>
    33.     <name>hadoop.proxyuser.root.hosts</name>
    34.     <value>*</value>
    35.   </property>
    36.    <!-- 配置该root允许代理的用户所属组 -->
    37.    <property>
    38.      <name>hadoop.proxyuser.root.groups</name>
    39.      <value>*</value>
    40.    </property>
    41.    <!-- 配置该root允许代理的用户 -->
    42.    <property>
    43.      <name>hadoop.proxyuser.root.users</name>
    44.      <value>*</value>
    45.    </property>
    46.    <!-- 对于每个<root>用户,hosts必须进行配置,而groups和users至少需要配置一个。-->
    47.    <!-- 文件系统垃圾桶保存时间 -->
    48.    <property>
    49.      <name>fs.trash.interval</name>
    50.      <value>1440</value>
    51.    </property>
    52. </configuration>

    (3)修改 hdfs 文件系统模块配置

    1. # 编辑 $HADOOP_HOME/etc/hadoop/hdfs-site.xml 文件
    2. vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
    3. # 配置如下
    4. <configuration>
    5. <!-- 为namenode集群定义一个services name,默认值:null -->
    6. <property>
    7. <name>dfs.nameservices</name>
    8. <value>mycluster</value>
    9. </property>
    10. <!-- 说明:nameservice 包含哪些namenode,为各个namenode起名,默认值:null,比如这里设置的nn1, nn2 -->
    11. <property>
    12. <name>dfs.ha.namenodes.mycluster</name>
    13. <value>nn1,nn2</value>
    14. </property>
    15. <!-- 说明:名为nn1的namenode 的rpc地址和端口号,rpc用来和datanode通讯,默认值:9000,local-168-182-110为节点hostname-->
    16. <property>
    17. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    18. <value>node1:8082</value>
    19. </property>
    20. <!-- 说明:名为nn2的namenode 的rpc地址和端口号,rpc用来和datanode通讯,默认值:9000,local-168-182-113为节点hostname-->
    21. <property>
    22. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    23. <value>node4:8082</value>
    24. </property>
    25. <!-- 说明:名为nn1的namenode 的http地址和端口号,web客户端 -->
    26. <property>
    27. <name>dfs.namenode.http-address.mycluster.nn1</name>
    28. <value>node1:9870</value>
    29. </property>
    30. <!-- 说明:名为nn2的namenode 的http地址和端口号,web客户端 -->
    31. <property>
    32. <name>dfs.namenode.http-address.mycluster.nn2</name>
    33. <value>node4:9870</value>
    34. </property>
    35. <!-- 说明:namenode间用于共享编辑日志的journal节点列表 -->
    36. <property>
    37. <name>dfs.namenode.shared.edits.dir</name>
    38. <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
    39. </property>
    40. <!-- 说明:客户端连接可用状态的NameNode所用的代理类,默认值:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider -->
    41. <property>
    42. <name>dfs.client.failover.proxy.provider.mycluster</name>
    43. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    44. </property>
    45. <!-- 说明:HDFS的HA功能的防脑裂方法。可以是内建的方法(例如shell和sshfence)或者用户定义的方法。
    46. 建议使用sshfence(hadoop:9922),括号内的是用户名和端口,注意,这需要NN的2台机器之间能够免密码登陆
    47. fences是防止脑裂的方法,保证NN中仅一个是Active的,如果2者都是Active的,新的会把旧的强制Kill
    48. -->
    49. <property>
    50. <name>dfs.ha.fencing.methods</name>
    51. <value>sshfence</value>
    52. </property>
    53. <!-- 指定上述选项ssh通讯使用的密钥文件在系统中的位置 -->
    54. <property>
    55. <name>dfs.ha.fencing.ssh.private-key-files</name>
    56. <value>/root/.ssh/id_rsa</value>
    57. </property>
    58. <!-- 说明:失效转移时使用的秘钥文件。 -->
    59. <property>
    60. <name>dfs.journalnode.edits.dir</name>
    61. <value>/root/hadoop-3.3.6/data/journalnode</value>
    62. </property>
    63. <!-- 开启NameNode失败自动切换 -->
    64. <property>
    65. <name>dfs.ha.automatic-failover.enabled</name>
    66. <value>true</value>
    67. </property>
    68. <!-- 配置失败自动切换实现方式 -->
    69. <property>
    70. <name>dfs.client.failover.proxy.provider.mycluster</name>
    71. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    72. </property>
    73. <!-- 设置数据块应该被复制的份数,也就是副本数,默认:3 -->
    74. <property>
    75. <name>dfs.replication</name>
    76. <value>3</value>
    77. </property>
    78. <!-- 说明:是否开启权限检查 -->
    79. <property>
    80. <name>dfs.permissions.enabled</name>
    81. <value>false</value>
    82. </property>
    83. <!-- 配合 HBase 或其他 dfs 客户端使用,表示开启短路径读,可以用来优化客户端性能 -->
    84. <property>
    85. <name>dfs.client.read.shortcircuit</name>
    86. <value>true</value>
    87. </property>
    88. <property>
    89. <name>dfs.domain.socket.path</name>
    90. <value>/root/hadoop-3.3.6/dn_socket</value>
    91. </property>
    92. </configuration>

    (4)修改 $HADOOP_HOME/etc/hadoop/workers

            将下面内容覆盖文件,默认只有 localhost,works 配置 DataNode 节点的主机名或IP,如果配置了 works 文件,并且配置 ssh 免密登录,可以使用 start-dfs.sh 启动 HDFS 集群。

    1. # 编辑 $HADOOP_HOME/etc/hadoop/workers 文件
    2. vim $HADOOP_HOME/etc/hadoop/workers
    3. # 内容如下
    4. node2
    5. node3
    6. node4

    3. YARN ResourceManager 高可用配置

    (1)修改 yarn 模块配置

    1. # 编辑 $HADOOP_HOME/etc/hadoop/yarn-site.xml 文件
    2. vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
    3. # 内容如下
    4. <configuration>
    5. <!--开启ResourceManager HA功能-->
    6. <property>
    7. <name>yarn.resourcemanager.ha.enabled</name>
    8. <value>true</value>
    9. </property>
    10. <!--标志ResourceManager-->
    11. <property>
    12. <name>yarn.resourcemanager.cluster-id</name>
    13. <value>myyarn</value>
    14. </property>
    15. <!--集群中ResourceManager的ID列表,后面的配置将引用该ID-->
    16. <property>
    17. <name>yarn.resourcemanager.ha.rm-ids</name>
    18. <value>rm1,rm2</value>
    19. </property>
    20. <!-- 设置YARN集群主角色运行节点rm1-->
    21. <property>
    22. <name>yarn.resourcemanager.hostname.rm1</name>
    23. <value>node1</value>
    24. </property>
    25. <!-- 设置YARN集群主角色运行节点rm2-->
    26. <property>
    27. <name>yarn.resourcemanager.hostname.rm2</name>
    28. <value>node4</value>
    29. </property>
    30. <!--ResourceManager1的Web页面访问地址-->
    31. <property>
    32. <name>yarn.resourcemanager.webapp.address.rm1</name>
    33. <value>node1:8088</value>
    34. </property>
    35. <!--ResourceManager2的Web页面访问地址-->
    36. <property>
    37. <name>yarn.resourcemanager.webapp.address.rm2</name>
    38. <value>node4:8088</value>
    39. </property>
    40. <!--ZooKeeper集群列表-->
    41. <property>
    42. <name>hadoop.zk.address</name>
    43. <value>node1:2181,node2:2181,node3:2181</value>
    44. </property>
    45. <!--启用ResouerceManager重启的功能,默认为false-->
    46. <property>
    47. <name>yarn.resourcemanager.recovery.enabled</name>
    48. <value>true</value>
    49. </property>
    50. <!--用于ResouerceManager状态存储的类-->
    51. <property>
    52. <name>yarn.resourcemanager.store.class</name>
    53. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    54. </property>
    55. <property>
    56. <name>yarn.nodemanager.aux-services</name>
    57. <value>mapreduce_shuffle</value>
    58. </property>
    59. <!-- 是否将对容器实施物理内存限制 -->
    60. <property>
    61. <name>yarn.nodemanager.pmem-check-enabled</name>
    62. <value>false</value>
    63. </property>
    64. <!-- 是否将对容器实施虚拟内存限制 -->
    65. <property>
    66. <name>yarn.nodemanager.vmem-check-enabled</name>
    67. <value>false</value>
    68. </property>
    69. <!-- 开启日志聚集 -->
    70. <property>
    71. <name>yarn.log-aggregation-enable</name>
    72. <value>true</value>
    73. </property>
    74. <!-- 设置yarn历史服务器地址 -->
    75. <property>
    76. <name>yarn.log.server.url</name>
    77. <value>http://node1:19888/jobhistory/logs</value>
    78. </property>
    79. <!-- 设置yarn历史日志保存时间 7天 -->
    80. <property>
    81. <name>yarn.log-aggregation.retain-seconds</name>
    82. <value>604880</value>
    83. </property>
    84. </configuration>

    (2)修改 MapReduce 模块配置

    1. # 编辑 $HADOOP_HOME/etc/hadoop/mapred-site.xml 文件
    2. vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
    3. # 内容如下
    4. <configuration>
    5. <!-- 设置MR程序默认运行模式,yarn集群模式,local本地模式 -->
    6. <property>
    7. <name>mapreduce.framework.name</name>
    8. <value>yarn</value>
    9. </property>
    10. <!-- MR程序历史服务地址 -->
    11. <property>
    12. <name>mapreduce.jobhistory.address</name>
    13. <value>node1:10020</value>
    14. </property>
    15. <!-- MR程序历史服务web端地址 -->
    16. <property>
    17. <name>mapreduce.jobhistory.webapp.address</name>
    18. <value>node1:19888</value>
    19. </property>
    20. <!-- yarn环境变量 -->
    21. <property>
    22. <name>yarn.app.mapreduce.am.env</name>
    23. <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    24. </property>
    25. <!-- map环境变量 -->
    26. <property>
    27. <name>mapreduce.map.env</name>
    28. <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    29. </property>
    30. <!-- reduce环境变量 -->
    31. <property>
    32. <name>mapreduce.reduce.env</name>
    33. <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    34. </property>
    35. </configuration>

    4. 分发配置文件其它节点

    1. # 设置组和属主
    2. chown -R root:root $HADOOP_HOME
    3. # Hadoop 主目录复制到另外三个节点
    4. scp -r $HADOOP_HOME node2:$HADOOP_HOME
    5. scp -r $HADOOP_HOME node3:$HADOOP_HOME
    6. scp -r $HADOOP_HOME node4:$HADOOP_HOME

    5. 启动 HDFS 相关服务

    1. # 启动journalnode,在 node1、node2、node3 机器上执行
    2. hdfs --daemon start journalnode
    3. # HDFS NameNode 数据同步,格式化(第一次配置情况下使用,已运行集群不能用),在 node1 执行
    4. hdfs namenode -format
    5. # 启动 node1 上的 NameNode 节点
    6. hdfs --daemon start namenode
    7. # node4 节点上同步镜像数据
    8. hdfs namenode -bootstrapStandby
    9. # node4 节点上启动 NameNode
    10. hdfs --daemon start namenode
    11. # zookeeper FailerController 格式化,在 node1 上执行
    12. hdfs zkfc -formatZK
    13. # 所有节点安装 psmisc。ZKFC 远程杀死假死 SNN 使用的 killall namenode 命令属于 psmisc 软件中。建议所有节点都安装 psmisc。
    14. yum install -y psmisc

    6. 添加环境变量

    1. # 编辑 ~/.bash_profile 文件,或者在 start-dfs.sh、stop-dfs.sh(hadoop 安装目录的 sbin 里)两个文件顶部添加这些环境变量
    2. vim ~/.bash_profile
    3. # 内容如下
    4. export HDFS_NAMENODE_USER=root
    5. export HDFS_DATANODE_USER=root
    6. export HDFS_JOURNALNODE_USER=root
    7. export HDFS_SECONDARYNAMENODE_USER=root
    8. export YARN_RESOURCEMANAGER_USER=root
    9. export YARN_NODEMANAGER_USER=root
    10. export HDFS_ZKFC_USER=root
    11. # 加载生效
    12. source ~/.bash_profile

    7. 启动 YARN 相关服务

    1. # 启动 hdfs,在 node1 节点上执行
    2. start-dfs.sh
    3. # node1 进程
    4. [root@vvml-yz-hbase-test~]#jps
    5. 11506 NameNode
    6. 9621 QuorumPeerMain
    7. 12373 Jps
    8. 12300 DFSZKFailoverController
    9. 11023 JournalNode
    10. [root@vvml-yz-hbase-test~]#
    11. # node2 进程
    12. [root@vvml-yz-hbase-test~]#jps
    13. 16754 DataNode
    14. 16405 JournalNode
    15. 16909 Jps
    16. 15007 QuorumPeerMain
    17. [root@vvml-yz-hbase-test~]#
    18. # node3 进程
    19. [root@vvml-yz-hbase-test~]#jps
    20. 7026 DataNode
    21. 5316 QuorumPeerMain
    22. 6699 JournalNode
    23. 7197 Jps
    24. [root@vvml-yz-hbase-test~]#
    25. # node4 进程
    26. [root@vvml-yz-hbase-test~]#jps
    27. 8000 Jps
    28. 7731 DataNode
    29. 7814 DFSZKFailoverController
    30. 7528 NameNode
    31. [root@vvml-yz-hbase-test~]#

            web地址:
    http://node1:9870/
    http://node4:9870/
            如下图所示,node1 为 active,node4 为 standby。

    8. 启动 YARN

    1. # 在 node1 节点上执行
    2. start-yarn.sh
    3. # node1 进程
    4. [root@vvml-yz-hbase-test~]#jps
    5. 11506 NameNode
    6. 9621 QuorumPeerMain
    7. 13354 Jps
    8. 12300 DFSZKFailoverController
    9. 12990 ResourceManager
    10. 11023 JournalNode
    11. [root@vvml-yz-hbase-test~]#
    12. # node2 进程
    13. [root@vvml-yz-hbase-test~]#jps
    14. 16754 DataNode
    15. 17219 NodeManager
    16. 16405 JournalNode
    17. 17350 Jps
    18. 15007 QuorumPeerMain
    19. [root@vvml-yz-hbase-test~]#
    20. # node3 进程
    21. [root@vvml-yz-hbase-test~]#jps
    22. 7026 DataNode
    23. 5316 QuorumPeerMain
    24. 7626 Jps
    25. 6699 JournalNode
    26. 7483 NodeManager
    27. [root@vvml-yz-hbase-test~]#
    28. # node4 进程
    29. [root@vvml-yz-hbase-test~]#jps
    30. 8256 ResourceManager
    31. 8352 NodeManager
    32. 7731 DataNode
    33. 7814 DFSZKFailoverController
    34. 7528 NameNode
    35. 8540 Jps
    36. [root@vvml-yz-hbase-test~]#

            web地址:
    http://node1:8088/cluster/cluster
    http://node4:8088/cluster/cluster
            如下图所示,node1 为 active,node4 为 standby。

    9. 启动 MapReduce 任务历史服务

    1. # 在 node1 节点上执行
    2. mapred --daemon start historyserver
    3. [root@vvml-yz-hbase-test~]#jps
    4. 11506 NameNode
    5. 9621 QuorumPeerMain
    6. 13704 Jps
    7. 12300 DFSZKFailoverController
    8. 13645 JobHistoryServer
    9. 12990 ResourceManager
    10. 11023 JournalNode
    11. [root@vvml-yz-hbase-test~]#

    五、Hadoop HA 测试验证

    1. HDFS NameNode HA 验证

    (1)查看 NameNode 节点状态,任一节点执行

    1. hdfs haadmin -getServiceState nn1
    2. hdfs haadmin -getServiceState nn2
    3. # 输出
    4. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
    5. active
    6. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
    7. standby
    8. [root@vvml-yz-hbase-test~]#

    (2)故障模拟

    1. # 在 active 的 NameNode 节点上(这里是 node1),kill 掉 NameNode 进程
    2. jps
    3. jps|grep NameNode|awk '{print $1}'|xargs kill -9
    4. jps
    5. # 输出
    6. [root@vvml-yz-hbase-test~]#jps
    7. 13904 Jps
    8. 11506 NameNode
    9. 9621 QuorumPeerMain
    10. 12300 DFSZKFailoverController
    11. 13645 JobHistoryServer
    12. 12990 ResourceManager
    13. 11023 JournalNode
    14. [root@vvml-yz-hbase-test~]#jps|grep NameNode|awk '{print $1}'|xargs kill -9
    15. [root@vvml-yz-hbase-test~]#jps
    16. 9621 QuorumPeerMain
    17. 12300 DFSZKFailoverController
    18. 13980 Jps
    19. 13645 JobHistoryServer
    20. 12990 ResourceManager
    21. 11023 JournalNode
    22. [root@vvml-yz-hbase-test~]#

    (3)查看节点状态,任一节点执行

    1. hdfs haadmin -getServiceState nn1
    2. hdfs haadmin -getServiceState nn2
    3. hdfs haadmin -getAllServiceState
    4. # 输出
    5. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
    6. 2024-03-05 10:50:41,928 INFO ipc.Client: Retrying connect to server: node1/172.18.4.126:8082. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    7. Operation failed: Call From node1/172.18.4.126 to node1:8082 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    8. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
    9. active
    10. [root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
    11. 2024-03-05 10:50:44,276 INFO ipc.Client: Retrying connect to server: node1/172.18.4.126:8082. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    12. node1:8082 Failed to connect: Call From node1/172.18.4.126 to node1:8082 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    13. node4:8082 active
    14. [root@vvml-yz-hbase-test~]#

            node4 状态变为 active。

    (4)故障恢复

    1. # 启动 namenode(node1 执行)
    2. hdfs --daemon start namenode
    3. jps
    4. # 输出
    5. [root@vvml-yz-hbase-test~]#hdfs --daemon start namenode
    6. [root@vvml-yz-hbase-test~]#jps
    7. 14352 NameNode
    8. 9621 QuorumPeerMain
    9. 14407 Jps
    10. 12300 DFSZKFailoverController
    11. 13645 JobHistoryServer
    12. 12990 ResourceManager
    13. 11023 JournalNode
    14. [root@vvml-yz-hbase-test~]#

    (5)查看节点状态,任一节点执行

    1. hdfs haadmin -getServiceState nn1
    2. hdfs haadmin -getServiceState nn2
    3. hdfs haadmin -getAllServiceState
    4. # 输出
    5. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
    6. standby
    7. [root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
    8. active
    9. [root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
    10. node1:8082 standby
    11. node4:8082 active
    12. [root@vvml-yz-hbase-test~]#

            node1 状态变为 standby。

    (6)再次测试自动切换

    1. # node4 执行
    2. # 模拟故障
    3. jps|grep NameNode|awk '{print $1}'|xargs kill -9
    4. # 确认切换
    5. hdfs haadmin -getAllServiceState
    6. # 故障恢复
    7. hdfs --daemon start namenode
    8. # 角色交换
    9. hdfs haadmin -getAllServiceState
    10. # 输出
    11. [root@vvml-yz-hbase-test~]#jps|grep NameNode|awk '{print $1}'|xargs kill -9
    12. [root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
    13. node1:8082 active
    14. 2024-03-05 10:56:35,128 INFO ipc.Client: Retrying connect to server: node4/172.18.4.86:8082. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    15. node4:8082 Failed to connect: Call From node4/172.18.4.86 to node4:8082 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    16. [root@vvml-yz-hbase-test~]#hdfs --daemon start namenode
    17. [root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
    18. node1:8082 active
    19. node4:8082 standby
    20. [root@vvml-yz-hbase-test~]#

    2. YARN ResourceManager HA 验证

    (1)查看 ResourceManager 节点状态,任一节点执行

    1. yarn rmadmin -getServiceState rm1
    2. yarn rmadmin -getServiceState rm2
    3. # 输出
    4. [root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm1
    5. active
    6. [root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm2
    7. standby
    8. [root@vvml-yz-hbase-test~]#

    (2)故障模拟

    1. # 在 active 的 ResourceManager 节点上(这里是 node1),kill 掉 ResourceManager 进程:
    2. jps
    3. jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
    4. jps
    5. # 输出
    6. [root@vvml-yz-hbase-test~]#jps
    7. 14352 NameNode
    8. 15122 Jps
    9. 9621 QuorumPeerMain
    10. 12300 DFSZKFailoverController
    11. 13645 JobHistoryServer
    12. 12990 ResourceManager
    13. 11023 JournalNode
    14. [root@vvml-yz-hbase-test~]#jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
    15. [root@vvml-yz-hbase-test~]#jps
    16. 14352 NameNode
    17. 9621 QuorumPeerMain
    18. 12300 DFSZKFailoverController
    19. 15164 Jps
    20. 13645 JobHistoryServer
    21. 11023 JournalNode
    22. [root@vvml-yz-hbase-test~]#

    (3)查看节点状态,任一节点执行

    1. yarn rmadmin -getServiceState rm1
    2. yarn rmadmin -getServiceState rm2
    3. yarn rmadmin -getAllServiceState
    4. # 输出
    5. [root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm1
    6. 2024-03-05 10:59:29,051 INFO ipc.Client: Retrying connect to server: node1/172.18.4.126:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    7. Operation failed: Call From node1/172.18.4.126 to node1:8033 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    8. [root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm2
    9. active
    10. [root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
    11. 2024-03-05 10:59:31,328 INFO ipc.Client: Retrying connect to server: node1/172.18.4.126:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    12. node1:8033 Failed to connect: Call From node1/172.18.4.126 to node1:8033 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    13. node4:8033 active
    14. [root@vvml-yz-hbase-test~]#

            node4 状态变为 active。

    (4)故障恢复

    1. # 启动 resourcemanager(node1执行)
    2. yarn --daemon start resourcemanager
    3. jps
    4. # 输出
    5. [root@vvml-yz-hbase-test~]#yarn --daemon start resourcemanager
    6. [root@vvml-yz-hbase-test~]#jps
    7. 14352 NameNode
    8. 15620 Jps
    9. 9621 QuorumPeerMain
    10. 15563 ResourceManager
    11. 12300 DFSZKFailoverController
    12. 13645 JobHistoryServer
    13. 11023 JournalNode
    14. [root@vvml-yz-hbase-test~]#

    (5)查看节点状态,任一节点执行

    1. yarn rmadmin -getAllServiceState
    2. # 输出
    3. [root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
    4. node1:8033 standby
    5. node4:8033 active
    6. [root@vvml-yz-hbase-test~]#

            node1 状态变为 standby。

    (6)再次测试自动切换

    1. # node4 执行
    2. # 模拟故障
    3. jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
    4. # 确认切换
    5. yarn rmadmin -getAllServiceState
    6. # 故障恢复
    7. yarn --daemon start resourcemanager
    8. # 角色交换
    9. yarn rmadmin -getAllServiceState
    10. # 输出
    11. [root@vvml-yz-hbase-test~]#jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
    12. [root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
    13. node1:8033 active
    14. 2024-03-05 11:03:47,735 INFO ipc.Client: Retrying connect to server: node4/172.18.4.86:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    15. node4:8033 Failed to connect: Call From node4/172.18.4.86 to node4:8033 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
    16. [root@vvml-yz-hbase-test~]#yarn --daemon start resourcemanager
    17. [root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
    18. node1:8033 active
    19. node4:8033 standby
    20. [root@vvml-yz-hbase-test~]#

            在配置了 Automatic failover 后,可以使用 -forcemanual 参数执行手动切换主备:

    1. # HDFS NameNode 切换,手动指定主备节点
    2. hdfs haadmin -transitionToStandby --forcemanual nn1
    3. hdfs haadmin -transitionToActive --forcemanual nn2
    4. # YARN ResourceManager 切换,手动指定主备节点
    5. yarn rmadmin -transitionToStandby -forcemanual rm1
    6. yarn rmadmin -transitionToActive -forcemanual rm2

            一定要谨慎使用 -forcemanual 参数,它可能引起问题,尤其是 YARN ResourceManager HA。在我的测试中,当手动指定 ResourceManager 主备节点切换后,停掉 active 节点,standby 不会变成 active,而是保持 standby 状态。再次启动停掉的节点,此时两个 ResourceManager 节点的状态都是 standby。只有重启 yarn 后才能再次正常执行自动失败切换。

    参考:

  • 相关阅读:
    基于springboot的社区医院管理系统的设计
    机器学习参数|数学建模|自相关性
    MATLAB编程:简易读取分割存储 tif 格式图片
    laravel5.1反序列化
    重装系统后新建文本文档打不开怎么办
    IOday1
    网卡限速工具之WonderShaper
    Code-Audit(代码审计)习题记录
    jar 文件携带参数启动
    微信小程序组件仿某音
  • 原文地址:https://blog.csdn.net/wzy0623/article/details/136476291