当前位置: 首页 > news >正文

基于 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 文件

# 编辑 /etc/hosts 文件
vim /etc/hosts# 添加主机名
172.18.4.126    node1
172.18.4.188    node2
172.18.4.71     node3
172.18.4.86     node4

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

# 生成秘钥
ssh-keygen# 复制公钥
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
ssh-copy-id node4
# 验证ssh node1 date
ssh node2 date
ssh node3 date
ssh node4 date

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

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

三、安装 JDK

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

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

        输出:

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

四、安装部署 Zookeeper 集群

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

1. 解压、配置环境变量

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

2. 创建配置文件

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

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

mkdir -p /var/lib/zookeeper/data
mkdir -p /var/lib/zookeeper/log

4. 添加 myid 配置

# node1 上
echo 1 > /var/lib/zookeeper/data/myid
# node2 上
echo 2 > /var/lib/zookeeper/data/myid
# node3 上
echo 3 > /var/lib/zookeeper/data/myid

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

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

6. 启动 ZooKeeper

zkServer.sh start

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

[root@vvml-yz-hbase-test~]#jps
5316 QuorumPeerMain
5373 Jps
[root@vvml-yz-hbase-test~]#

7. 查看 ZooKeeper 状态

zkServer.sh status

        node1 输出:

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

        node2 输出:

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

        node3 输出:

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

        node2 为 leader,node1、node3 为 follower。

8. 简单测试 ZooKeeper 命令

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

五、安装配置 Hadoop HA 集群

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

# 解压
tar -zvxf hadoop-3.3.6.tar.gz# 编辑 /etc/profile 文件
vim /etc/profile# 添加如下两行
export HADOOP_HOME=/root/hadoop-3.3.6/
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH# 加载生效
source /etc/profile# 编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 文件设置 Hadoop 运行环境
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh# 在文件末尾添加
export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HADOOP_PID_DIR=/root/hadoop-3.3.6

2. HDFS 高可用配置

(1)创建存储目录

mkdir -p $HADOOP_HOME/data/namenode
mkdir -p $HADOOP_HOME/data/journalnode

(2)修改核心模块配置

# 编辑 $HADOOP_HOME/etc/hadoop/core-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/core-site.xml# 配置如下
<configuration><!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --><property><name>fs.defaultFS</name><value>hdfs://mycluster</value><final>true</final></property><property><name>io.file.buffer.szie</name><value>131072</value></property><!-- 设置Hadoop本地保存数据路径 --><property><name>hadoop.tmp.dir</name><value>/root/hadoop-3.3.6/data/namenode</value></property><!-- 指定zookeeper地址 --><property><name>ha.zookeeper.quorum</name><value>node1:2181,node2:2181,node3:2181</value></property><!-- 设置HDFS web UI用户身份 --><property><name>hadoop.http.staticuser.user</name><value>root</value></property><!-- 配置该root允许通过代理访问的主机节点 --><property><name>hadoop.proxyuser.root.hosts</name><value>*</value></property><!-- 配置该root允许代理的用户所属组 --><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property><!-- 配置该root允许代理的用户 --><property><name>hadoop.proxyuser.root.users</name><value>*</value></property><!-- 对于每个<root>用户,hosts必须进行配置,而groups和users至少需要配置一个。--><!-- 文件系统垃圾桶保存时间 --><property><name>fs.trash.interval</name><value>1440</value></property></configuration>

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

# 编辑 $HADOOP_HOME/etc/hadoop/hdfs-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml# 配置如下
<configuration><!-- 为namenode集群定义一个services name,默认值:null --><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- 说明:nameservice 包含哪些namenode,为各个namenode起名,默认值:null,比如这里设置的nn1, nn2 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- 说明:名为nn1的namenode 的rpc地址和端口号,rpc用来和datanode通讯,默认值:9000,local-168-182-110为节点hostname--><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>node1:8082</value></property><!-- 说明:名为nn2的namenode 的rpc地址和端口号,rpc用来和datanode通讯,默认值:9000,local-168-182-113为节点hostname--><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>node4:8082</value></property><!-- 说明:名为nn1的namenode 的http地址和端口号,web客户端 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>node1:9870</value></property><!-- 说明:名为nn2的namenode 的http地址和端口号,web客户端 --><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>node4:9870</value></property><!-- 说明:namenode间用于共享编辑日志的journal节点列表 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value></property><!-- 说明:客户端连接可用状态的NameNode所用的代理类,默认值:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 说明:HDFS的HA功能的防脑裂方法。可以是内建的方法(例如shell和sshfence)或者用户定义的方法。建议使用sshfence(hadoop:9922),括号内的是用户名和端口,注意,这需要NN的2台机器之间能够免密码登陆
fences是防止脑裂的方法,保证NN中仅一个是Active的,如果2者都是Active的,新的会把旧的强制Kill--><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><!-- 指定上述选项ssh通讯使用的密钥文件在系统中的位置 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><!-- 说明:失效转移时使用的秘钥文件。 --><property><name>dfs.journalnode.edits.dir</name><value>/root/hadoop-3.3.6/data/journalnode</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 设置数据块应该被复制的份数,也就是副本数,默认:3 --><property><name>dfs.replication</name><value>3</value></property><!-- 说明:是否开启权限检查 --><property><name>dfs.permissions.enabled</name><value>false</value></property><!-- 配合 HBase 或其他 dfs 客户端使用,表示开启短路径读,可以用来优化客户端性能 --><property><name>dfs.client.read.shortcircuit</name><value>true</value></property><property><name>dfs.domain.socket.path</name><value>/root/hadoop-3.3.6/dn_socket</value></property></configuration>

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

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

# 编辑 $HADOOP_HOME/etc/hadoop/workers 文件
vim $HADOOP_HOME/etc/hadoop/workers# 内容如下
node2
node3
node4

3. YARN ResourceManager 高可用配置

(1)修改 yarn 模块配置

# 编辑 $HADOOP_HOME/etc/hadoop/yarn-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml# 内容如下
<configuration><!--开启ResourceManager HA功能--><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!--标志ResourceManager--><property><name>yarn.resourcemanager.cluster-id</name><value>myyarn</value></property><!--集群中ResourceManager的ID列表,后面的配置将引用该ID--><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 设置YARN集群主角色运行节点rm1--><property><name>yarn.resourcemanager.hostname.rm1</name><value>node1</value></property><!-- 设置YARN集群主角色运行节点rm2--><property><name>yarn.resourcemanager.hostname.rm2</name><value>node4</value></property><!--ResourceManager1的Web页面访问地址--><property><name>yarn.resourcemanager.webapp.address.rm1</name><value>node1:8088</value></property><!--ResourceManager2的Web页面访问地址--><property><name>yarn.resourcemanager.webapp.address.rm2</name><value>node4:8088</value></property><!--ZooKeeper集群列表--><property><name>hadoop.zk.address</name><value>node1:2181,node2:2181,node3:2181</value></property><!--启用ResouerceManager重启的功能,默认为false--><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!--用于ResouerceManager状态存储的类--><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 是否将对容器实施物理内存限制 --><property><name>yarn.nodemanager.pmem-check-enabled</name><value>false</value></property><!-- 是否将对容器实施虚拟内存限制 --><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property><!-- 开启日志聚集 --><property><name>yarn.log-aggregation-enable</name><value>true</value></property><!-- 设置yarn历史服务器地址 --><property><name>yarn.log.server.url</name><value>http://node1:19888/jobhistory/logs</value></property><!-- 设置yarn历史日志保存时间 7天 --><property><name>yarn.log-aggregation.retain-seconds</name><value>604880</value></property></configuration>

(2)修改 MapReduce 模块配置

# 编辑 $HADOOP_HOME/etc/hadoop/mapred-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml# 内容如下
<configuration><!-- 设置MR程序默认运行模式,yarn集群模式,local本地模式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- MR程序历史服务地址 --><property><name>mapreduce.jobhistory.address</name><value>node1:10020</value></property><!-- MR程序历史服务web端地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value></property><!-- yarn环境变量 --><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><!-- map环境变量 --><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><!-- reduce环境变量 --><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property></configuration>

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

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

5. 启动 HDFS 相关服务

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

6. 添加环境变量

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

7. 启动 YARN 相关服务

# 启动 hdfs,在 node1 节点上执行
start-dfs.sh# node1 进程
[root@vvml-yz-hbase-test~]#jps
11506 NameNode
9621 QuorumPeerMain
12373 Jps
12300 DFSZKFailoverController
11023 JournalNode
[root@vvml-yz-hbase-test~]## node2 进程
[root@vvml-yz-hbase-test~]#jps
16754 DataNode
16405 JournalNode
16909 Jps
15007 QuorumPeerMain
[root@vvml-yz-hbase-test~]## node3 进程
[root@vvml-yz-hbase-test~]#jps
7026 DataNode
5316 QuorumPeerMain
6699 JournalNode
7197 Jps
[root@vvml-yz-hbase-test~]## node4 进程
[root@vvml-yz-hbase-test~]#jps
8000 Jps
7731 DataNode
7814 DFSZKFailoverController
7528 NameNode
[root@vvml-yz-hbase-test~]#

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

8. 启动 YARN

# 在 node1 节点上执行
start-yarn.sh# node1 进程
[root@vvml-yz-hbase-test~]#jps
11506 NameNode
9621 QuorumPeerMain
13354 Jps
12300 DFSZKFailoverController
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]## node2 进程
[root@vvml-yz-hbase-test~]#jps
16754 DataNode
17219 NodeManager
16405 JournalNode
17350 Jps
15007 QuorumPeerMain
[root@vvml-yz-hbase-test~]## node3 进程
[root@vvml-yz-hbase-test~]#jps
7026 DataNode
5316 QuorumPeerMain
7626 Jps
6699 JournalNode
7483 NodeManager
[root@vvml-yz-hbase-test~]## node4 进程
[root@vvml-yz-hbase-test~]#jps
8256 ResourceManager
8352 NodeManager
7731 DataNode
7814 DFSZKFailoverController
7528 NameNode
8540 Jps
[root@vvml-yz-hbase-test~]#

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

9. 启动 MapReduce 任务历史服务

# 在 node1 节点上执行
mapred --daemon start historyserver[root@vvml-yz-hbase-test~]#jps
11506 NameNode
9621 QuorumPeerMain
13704 Jps
12300 DFSZKFailoverController
13645 JobHistoryServer
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#

五、Hadoop HA 测试验证

1. HDFS NameNode HA 验证

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

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2# 输出
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
active
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
standby
[root@vvml-yz-hbase-test~]#

(2)故障模拟

# 在 active 的 NameNode 节点上(这里是 node1),kill 掉 NameNode 进程
jps
jps|grep NameNode|awk '{print $1}'|xargs kill -9
jps# 输出
[root@vvml-yz-hbase-test~]#jps
13904 Jps
11506 NameNode
9621 QuorumPeerMain
12300 DFSZKFailoverController
13645 JobHistoryServer
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#jps|grep NameNode|awk '{print $1}'|xargs kill -9
[root@vvml-yz-hbase-test~]#jps
9621 QuorumPeerMain
12300 DFSZKFailoverController
13980 Jps
13645 JobHistoryServer
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#

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

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
hdfs haadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
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)
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
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
active
[root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
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)
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
node4:8082                                         active    
[root@vvml-yz-hbase-test~]#

        node4 状态变为 active。

(4)故障恢复

# 启动 namenode(node1 执行)
hdfs --daemon start namenode
jps# 输出
[root@vvml-yz-hbase-test~]#hdfs --daemon start namenode
[root@vvml-yz-hbase-test~]#jps
14352 NameNode
9621 QuorumPeerMain
14407 Jps
12300 DFSZKFailoverController
13645 JobHistoryServer
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#

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

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
hdfs haadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn1
standby
[root@vvml-yz-hbase-test~]#hdfs haadmin -getServiceState nn2
active
[root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
node1:8082                                         standby   
node4:8082                                         active    
[root@vvml-yz-hbase-test~]#

        node1 状态变为 standby。

(6)再次测试自动切换

# node4 执行
# 模拟故障
jps|grep NameNode|awk '{print $1}'|xargs kill -9
# 确认切换
hdfs haadmin -getAllServiceState
# 故障恢复
hdfs --daemon start namenode
# 角色交换
hdfs haadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#jps|grep NameNode|awk '{print $1}'|xargs kill -9
[root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
node1:8082                                         active    
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)
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
[root@vvml-yz-hbase-test~]#hdfs --daemon start namenode
[root@vvml-yz-hbase-test~]#hdfs haadmin -getAllServiceState
node1:8082                                         active    
node4:8082                                         standby   
[root@vvml-yz-hbase-test~]#

2. YARN ResourceManager HA 验证

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

yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2# 输出
[root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm1
active
[root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm2
standby
[root@vvml-yz-hbase-test~]#

(2)故障模拟

# 在 active 的 ResourceManager 节点上(这里是 node1),kill 掉 ResourceManager 进程:
jps
jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
jps# 输出
[root@vvml-yz-hbase-test~]#jps
14352 NameNode
15122 Jps
9621 QuorumPeerMain
12300 DFSZKFailoverController
13645 JobHistoryServer
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
[root@vvml-yz-hbase-test~]#jps
14352 NameNode
9621 QuorumPeerMain
12300 DFSZKFailoverController
15164 Jps
13645 JobHistoryServer
11023 JournalNode
[root@vvml-yz-hbase-test~]#

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

yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
yarn rmadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm1
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)
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
[root@vvml-yz-hbase-test~]#yarn rmadmin -getServiceState rm2
active
[root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
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)
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
node4:8033                                         active    
[root@vvml-yz-hbase-test~]#

        node4 状态变为 active。

(4)故障恢复

# 启动 resourcemanager(node1执行)
yarn --daemon start resourcemanager
jps# 输出
[root@vvml-yz-hbase-test~]#yarn --daemon start resourcemanager
[root@vvml-yz-hbase-test~]#jps
14352 NameNode
15620 Jps
9621 QuorumPeerMain
15563 ResourceManager
12300 DFSZKFailoverController
13645 JobHistoryServer
11023 JournalNode
[root@vvml-yz-hbase-test~]#

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

yarn rmadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
node1:8033                                         standby   
node4:8033                                         active    
[root@vvml-yz-hbase-test~]#

        node1 状态变为 standby。

(6)再次测试自动切换

# node4 执行
# 模拟故障
jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
# 确认切换
yarn rmadmin -getAllServiceState
# 故障恢复
yarn --daemon start resourcemanager
# 角色交换
yarn rmadmin -getAllServiceState# 输出
[root@vvml-yz-hbase-test~]#jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
[root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
node1:8033                                         active    
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)
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
[root@vvml-yz-hbase-test~]#yarn --daemon start resourcemanager
[root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
node1:8033                                         active    
node4:8033                                         standby   
[root@vvml-yz-hbase-test~]#

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

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

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

参考:

  • 大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)
  • HDFS High Availability Using the Quorum Journal Manager
  • ResourceManager High Availability

相关文章:

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

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数&#xff08;可选&#xff09; 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…...

XS2185:八通道PSE控制器产品

八通道PSE控制器产品-XS2185 芯片特性 八通道PSE 支持标准PD供电 支持非标PD供电 每个端口功率最大30W 12位端口电流监测 12位电源电压监测 支持直流负载断开检测 支持LED供电状态指示 支持过流保护 支持短路保护 Sifos基本测试通过 32-PIN…...

Selenium WebDriver API 中涉及的一些常用方法和类

Selenium WebDriver API 是 Selenium 提供的一组方法和类&#xff0c;用于控制浏览器和操作 Web 元素。这些 API 提供了丰富的功能&#xff0c;包括但不限于&#xff1a; 1. **查找元素**&#xff1a;通过不同的定位方式&#xff08;如ID、Class Name、XPath等&#xff09;在页…...

OJ_复数集合

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <queue> #include <string> using namespace std;struct Complex {int re;int im;//构造函数Complex(int _re, int _im) {//注意参数名字必须不同re _re;im _im;} };//结构体不支…...

【学一点RISC-V】ACLINT(高级核心本地中断控制器)文档

RISCV架构 ACLINT文档 ACLINT原文档&#xff1a;https://github.com/riscv/riscv-aclint/blob/main/riscv-aclint.adoc 在这里进行了翻译以及校对&#xff0c;仅供参考&#xff0c;不正确的地方欢迎指出 1、介绍 【此 RISC-V ACLINT 规范定义了一组内存映射设备&#xff0c;这…...

grafana table合并查询

注&#xff1a;本文基于Grafana v9.2.8编写 1 问题 默认情况下table展示的是一个查询返回的多个field&#xff0c;但是我想要的数据在不同的metric上&#xff0c;比如我需要显示某个pod的读写IO&#xff0c;但是读和写这两个指标存在于两个不同的metirc&#xff0c;需要分别查…...

编程笔记 html5cssjs 007 文章排版 颜真卿《述张长史笔法十二意》

编程笔记 html5&css&js 007 文章排版 颜真卿《述张长史笔法十二意》 一、代码二、解释 这段代码定义了一个古文展示页面的结构和样式&#xff0c;同时本文内容也是书法爱好者的珍贵资料。 一、代码 <!DOCTYPE html> <html lang"zh-CN"> <hea…...

Yolov8模型用torch_pruning剪枝

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 原理 遍历所有分组 高级剪枝器 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680…...

C++字符串操作【超详细】

零.前言 本文将重点围绕C的字符串来展开描述。 其中&#xff0c;对于C/C中字符串的一些区别也做出了回答&#xff0c;并对于C的&#xff08;string库&#xff09;进行了讲解&#xff0c;最后我们给出字符串的不同表达形式。 开发环境&#xff1a; VS2022 一.字符串常量跟字…...

Ps:画笔工具

画笔工具 Brush Tool是 Photoshop 中最常用的工具&#xff0c;可广泛地用于绘画与修饰工作之中。 快捷键&#xff1a;B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…...

【鸿蒙 HarmonyOS 4.0】弹性布局(Flex)

一、介绍 弹性布局&#xff08;Flex&#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴方向的尺寸称为主轴尺寸&#xff0c;在交叉轴方向的尺寸称为交叉轴尺寸…...

Java 客户端向服务端上传文件(TCP通信)

一、实验内容 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名&#xff0c;即IP&#xff08;count&#…...

问题:前端获取long型数值精度丢失,后面几位都为0

文章目录 问题分析解决 问题 通过接口获取到的数据和 Postman 获取到的数据不一样&#xff0c;仔细看 data 的第17位之后 分析 该字段类型是long类型问题&#xff1a;前端接收到数据后&#xff0c;发现精度丢失&#xff0c;当返回的结果超过17位的时候&#xff0c;后面的全…...

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技术&#xff1a;输…...

LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…...

海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍

在当今数字化时代&#xff0c;媒体宣发成为了企业推广产品和品牌的重要手段之一。其中&#xff0c;7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐&#xff0c;以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前&#xff0c;让…...

开发知识点-Apache Struts2框架

Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC&#xff08;模型-视图-控制器&#xff09;设计模式的Web应用程序框架&#xff0c;它是Apache旗下的一个开源项目&#xff0c;并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…...

【Spring高级】第3讲 Bean的生命周期

目录 基本的生命周期后处理器总结 基本的生命周期 为了演示生命周期的过程&#xff0c;我们直接使用 SpringApplication.run()方法&#xff0c;他会直接诶返回一个容器对象。 import org.springframework.boot.SpringApplication; import org.springframework.context.Config…...

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分&#xff0c;其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部&#xff0c;确保只要远程窗口有空间&#xff0c;就可以发送数据。 下面是对该函数的一些主要逻辑的中…...

opencv实现视频人脸识别

一. 实现指定图像的人脸识别 注意&#xff1a; 以下实例参考《OpenCV轻松入门面向Python》李立宗著&#xff0c;使用python语言&#xff0c;编辑器为PyCharm&#xff0c;且都运行成功。 1.dface3.jpg图片文件和当前代码放在同一级目录下。 2.级联分类器文件和当前代码文件放在…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...