目錄
一、主機(jī)規(guī)劃
二、環(huán)境準(zhǔn)備
1. 啟動(dòng) NTP 時(shí)鐘同步
2. 修改 hosts 文件
3. 配置所有主機(jī)間 ssh 免密
4. 修改用戶可打開文件數(shù)與進(jìn)程數(shù)(可選)
三、安裝 JDK
四、安裝部署?Zookeeper 集群
1. 解壓、配置環(huán)境變量
2. 創(chuàng)建配置文件
3. 創(chuàng)建新的空 ZooKeeper 數(shù)據(jù)目錄和事務(wù)日志目錄
4. 添加 myid 配置
5. 設(shè)置 Zookeeper 使用的 JVM 堆內(nèi)存
6. 啟動(dòng) ZooKeeper
7. 查看 ZooKeeper 狀態(tài)
8. 簡單測試 ZooKeeper 命令
五、安裝配置 Hadoop HA 集群
1. 解壓、配置環(huán)境變量(node1 執(zhí)行)
2. HDFS 高可用配置
(1)創(chuàng)建存儲(chǔ)目錄
(2)修改核心模塊配置
(3)修改 hdfs 文件系統(tǒng)模塊配置
(4)修改 $HADOOP_HOME/etc/hadoop/workers
3. YARN ResourceManager 高可用配置
(1)修改 yarn 模塊配置
(2)修改 MapReduce 模塊配置
4. 分發(fā)配置文件其它節(jié)點(diǎn)
5. 啟動(dòng) HDFS 相關(guān)服務(wù)
6.?添加環(huán)境變量
7. 啟動(dòng) YARN 相關(guān)服務(wù)
8. 啟動(dòng) YARN
9. 啟動(dòng) MapReduce 任務(wù)歷史服務(wù)
五、Hadoop HA 測試驗(yàn)證
1. HDFS NameNode HA 驗(yàn)證
(1)查看 NameNode 節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(2)故障模擬
(3)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(4)故障恢復(fù)
(5)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(6)再次測試自動(dòng)切換
2. YARN ResourceManager HA 驗(yàn)證
(1)查看 ResourceManager 節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(2)故障模擬
(3)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(4)故障恢復(fù)
(5)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
(6)再次測試自動(dòng)切換
參考:
一、主機(jī)規(guī)劃
? ? ? ? 使用以下四臺(tái)虛擬機(jī)搭建測試環(huán)境,保證網(wǎng)絡(luò)連通,禁用防火墻。
- IP/主機(jī)名:
172.18.4.126?? ?node1
172.18.4.188?? ?node2
172.18.4.71? ? ? node3
172.18.4.86? ? ? node4
- 資源配置:
CPU:4核超線程;內(nèi)存:8GB;Swap:4GB;硬盤:200GB。
- 操作系統(tǒng):
CentOS Linux release 7.9.2009 (Core)
- 所需安裝包:
jdk-8u202
Zookeeper-3.9.1
Hadoop-3.3.6
? ? ? ? 下表描述了四個(gè)節(jié)點(diǎn)上分別將會(huì)運(yùn)行的相關(guān)進(jìn)程。簡便起見,安裝部署過程中所用的命令都使用操作系統(tǒng)的 root 用戶執(zhí)行。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??節(jié)點(diǎn) 進(jìn)程 |
node1 |
node2 |
node3 |
node4 |
Zookeeper |
* |
* |
* |
|
NameNode |
* |
* |
||
DataNode |
* |
* |
* |
|
ZKFC |
* |
* |
||
JournalNode |
* |
* |
* |
|
ResourceManager |
* |
* |
||
NodeManager |
* |
* |
* |
|
JobHistoryServer |
* |
二、環(huán)境準(zhǔn)備
? ? ? ? 在全部四臺(tái)機(jī)器執(zhí)行以下步驟。
1. 啟動(dòng) NTP 時(shí)鐘同步
? ? ? ? 略??蓞⒖?Greenplum 6 安裝配置詳解_greenplum6安裝-CSDN博客
2. 修改 hosts 文件
# 編輯 /etc/hosts 文件
vim /etc/hosts
# 添加主機(jī)名
172.18.4.126?? ?node1
172.18.4.188?? ?node2
172.18.4.71?? ? node3
172.18.4.86?? ? node4
3. 配置所有主機(jī)間 ssh 免密
# 生成秘鑰
ssh-keygen
# 復(fù)制公鑰
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
ssh-copy-id node4
# 驗(yàn)證
ssh node1 date
ssh node2 date
ssh node3 date
ssh node4 date
4. 修改用戶可打開文件數(shù)與進(jìn)程數(shù)(可選)
# 查看
ulimit -a
# 設(shè)置,編輯 /etc/security/limits.conf 文件
vim /etc/security/limits.conf
# 添加下面兩行
*?? ?soft?? ?nofile?? ?512000
*?? ?hard?? ?nofile?? ?512000
三、安裝 JDK
? ? ? ? 分別在 node1 - node4 四臺(tái)上機(jī)器執(zhí)行:
# 安裝
rpm -ivh jdk-8u202-linux-x64.rpm
# 確認(rèn)版本
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 三臺(tái)機(jī)器執(zhí)行以下步驟。
1. 解壓、配置環(huán)境變量
# 解壓
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. 創(chuàng)建配置文件
# 備份
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
vim $ZOOKEEPER_HOME/conf/zoo.cfg
# 編輯 zoo.cfg 文件內(nèi)容如下:
# ZooKeeper 使用的毫秒為單位的時(shí)間單元,用于進(jìn)行心跳,最小會(huì)話超時(shí)將是 tickTime 的兩倍。
tickTime=2000
# 存儲(chǔ)內(nèi)存中數(shù)據(jù)庫快照的位置。
dataDir=/var/lib/zookeeper/data
# 數(shù)據(jù)庫更新的事務(wù)日志所在目錄。
dataLogDir=/var/lib/zookeeper/log
# 監(jiān)聽客戶端連接的端口。
clientPort=2181
# LF 初始通信時(shí)限,即集群中的 follower 服務(wù)器(F)與 leader 服務(wù)器(L)之間初始連接時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量)。
initLimit=5
# LF 同步通信時(shí)限,即集群中的 follower 服務(wù)器(F)與 leader 服務(wù)器(L)之間請(qǐng)求和應(yīng)答之間能容忍的最多心跳數(shù)(tickTime的數(shù)量)。
syncLimit=2
# 集群配置 server.服務(wù)器ID=服務(wù)器IP地址:服務(wù)器之間通信端口:服務(wù)器之間投票選舉端口。當(dāng)服務(wù)器啟動(dòng)時(shí),通過在數(shù)據(jù)目錄中查找文件 myid 來知道它是哪臺(tái)服務(wù)器。
server.1=172.18.4.126:2888:3888
server.2=172.18.4.188:2888:3888
server.3=172.18.4.71:2888:3888
# 指定自動(dòng)清理事務(wù)日志和快照文件的頻率,單位是小時(shí)。?
autopurge.purgeInterval=1
3. 創(chuàng)建新的空 ZooKeeper 數(shù)據(jù)目錄和事務(wù)日志目錄
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. 設(shè)置 Zookeeper 使用的 JVM 堆內(nèi)存
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. 啟動(dòng) ZooKeeper
zkServer.sh start
? ? ? ? 日志記錄在安裝目錄下的 logs 目錄中,如本例中的 /root/apache-zookeeper-3.9.1-bin/logs。用 jps 可以看到 QuorumPeerMain 進(jìn)程:
[root@vvml-yz-hbase-test~]#jps
5316 QuorumPeerMain
5373 Jps
[root@vvml-yz-hbase-test~]#
7. 查看 ZooKeeper 狀態(tài)
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
?
# 控制臺(tái)輸出
/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] quit
WATCHER::
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. 解壓、配置環(huán)境變量(node1 執(zhí)行)
# 解壓
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 文件設(shè)置 Hadoop 運(yùn)行環(huán)境
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)創(chuàng)建存儲(chǔ)目錄
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>
? <!-- 設(shè)置默認(rèn)使用的文件系統(tǒng) Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系統(tǒng) -->
? <property>
? ? <name>fs.defaultFS</name>
? ? <value>hdfs://mycluster</value>
? ? <final>true</final>
? </property>
??
? <property>
? ? <name>io.file.buffer.szie</name>
? ? <value>131072</value>
? </property>
? <!-- 設(shè)置Hadoop本地保存數(shù)據(jù)路徑 -->
? <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>
? <!-- 設(shè)置HDFS web UI用戶身份 -->
? <property>
? ? <name>hadoop.http.staticuser.user</name>
? ? <value>root</value>
? </property>
? <!-- 配置該root允許通過代理訪問的主機(jī)節(jié)點(diǎn) -->
? <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>
? ?<!-- 對(duì)于每個(gè)<root>用戶,hosts必須進(jìn)行配置,而groups和users至少需要配置一個(gè)。-->
? ?<!-- 文件系統(tǒng)垃圾桶保存時(shí)間 -->
? ?<property>
? ? ?<name>fs.trash.interval</name>
? ? ?<value>1440</value>
? ?</property>
</configuration>
(3)修改 hdfs 文件系統(tǒng)模塊配置
# 編輯 $HADOOP_HOME/etc/hadoop/hdfs-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
# 配置如下
<configuration>
<!-- 為namenode集群定義一個(gè)services name,默認(rèn)值:null -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 說明:nameservice 包含哪些namenode,為各個(gè)namenode起名,默認(rèn)值:null,比如這里設(shè)置的nn1, nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 說明:名為nn1的namenode 的rpc地址和端口號(hào),rpc用來和datanode通訊,默認(rèn)值:9000,local-168-182-110為節(jié)點(diǎn)hostname-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8082</value>
</property>
<!-- 說明:名為nn2的namenode 的rpc地址和端口號(hào),rpc用來和datanode通訊,默認(rèn)值:9000,local-168-182-113為節(jié)點(diǎn)hostname-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node4:8082</value>
</property>
<!-- 說明:名為nn1的namenode 的http地址和端口號(hào),web客戶端 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<!-- 說明:名為nn2的namenode 的http地址和端口號(hào),web客戶端 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node4:9870</value>
</property>
<!-- 說明:namenode間用于共享編輯日志的journal節(jié)點(diǎn)列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!-- 說明:客戶端連接可用狀態(tài)的NameNode所用的代理類,默認(rèn)值: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功能的防腦裂方法。可以是內(nèi)建的方法(例如shell和sshfence)或者用戶定義的方法。
建議使用sshfence(hadoop:9922),括號(hào)內(nèi)的是用戶名和端口,注意,這需要NN的2臺(tái)機(jī)器之間能夠免密碼登陸
fences是防止腦裂的方法,保證NN中僅一個(gè)是Active的,如果2者都是Active的,新的會(huì)把舊的強(qiáng)制Kill
-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 指定上述選項(xiàng)ssh通訊使用的密鑰文件在系統(tǒng)中的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 說明:失效轉(zhuǎn)移時(shí)使用的秘鑰文件。 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/hadoop-3.3.6/data/journalnode</value>
</property>
<!-- 開啟NameNode失敗自動(dòng)切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動(dòng)切換實(shí)現(xiàn)方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 設(shè)置數(shù)據(jù)塊應(yīng)該被復(fù)制的份數(shù),也就是副本數(shù),默認(rèn):3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 說明:是否開啟權(quán)限檢查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 配合 HBase 或其他 dfs 客戶端使用,表示開啟短路徑讀,可以用來優(yōu)化客戶端性能 -->
<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
? ? ? ? 將下面內(nèi)容覆蓋文件,默認(rèn)只有 localhost,works 配置?DataNode 節(jié)點(diǎn)的主機(jī)名或IP,如果配置了 works 文件,并且配置 ssh 免密登錄,可以使用 start-dfs.sh 啟動(dòng) HDFS 集群。
# 編輯 $HADOOP_HOME/etc/hadoop/workers 文件
vim $HADOOP_HOME/etc/hadoop/workers
# 內(nèi)容如下
node2
node3
node4
3. YARN ResourceManager 高可用配置
(1)修改 yarn 模塊配置
# 編輯 $HADOOP_HOME/etc/hadoop/yarn-site.xml 文件
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
# 內(nèi)容如下
<configuration>
<!--開啟ResourceManager HA功能-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--標(biāo)志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>
<!-- 設(shè)置YARN集群主角色運(yùn)行節(jié)點(diǎn)rm1-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
</property>
<!-- 設(shè)置YARN集群主角色運(yùn)行節(jié)點(diǎn)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重啟的功能,默認(rèn)為false-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--用于ResouerceManager狀態(tài)存儲(chǔ)的類-->
<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>
<!-- 是否將對(duì)容器實(shí)施物理內(nèi)存限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否將對(duì)容器實(shí)施虛擬內(nèi)存限制 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 開啟日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 設(shè)置yarn歷史服務(wù)器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 設(shè)置yarn歷史日志保存時(shí)間 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
# 內(nèi)容如下
<configuration>
<!-- 設(shè)置MR程序默認(rèn)運(yùn)行模式,yarn集群模式,local本地模式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序歷史服務(wù)地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- MR程序歷史服務(wù)web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<!-- yarn環(huán)境變量 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- map環(huán)境變量 -->
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- reduce環(huán)境變量 -->
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
4. 分發(fā)配置文件其它節(jié)點(diǎn)
# 設(shè)置組和屬主
chown -R root:root $HADOOP_HOME
# Hadoop 主目錄復(fù)制到另外三個(gè)節(jié)點(diǎn)
scp -r $HADOOP_HOME node2:$HADOOP_HOME
scp -r $HADOOP_HOME node3:$HADOOP_HOME
scp -r $HADOOP_HOME node4:$HADOOP_HOME
5. 啟動(dòng) HDFS 相關(guān)服務(wù)
# 啟動(dòng)journalnode,在 node1、node2、node3 機(jī)器上執(zhí)行
hdfs --daemon start journalnode
# HDFS NameNode 數(shù)據(jù)同步,格式化(第一次配置情況下使用,已運(yùn)行集群不能用),在 node1 執(zhí)行
hdfs namenode -format
# 啟動(dòng) node1 上的 NameNode 節(jié)點(diǎn)
hdfs --daemon start namenode
# node4 節(jié)點(diǎn)上同步鏡像數(shù)據(jù)
hdfs namenode -bootstrapStandby
# node4 節(jié)點(diǎn)上啟動(dòng) NameNode
hdfs --daemon start namenode
# zookeeper FailerController 格式化,在 node1 上執(zhí)行
hdfs zkfc -formatZK
# 所有節(jié)點(diǎn)安裝 psmisc。ZKFC 遠(yuǎn)程殺死假死 SNN 使用的 killall namenode 命令屬于 psmisc 軟件中。建議所有節(jié)點(diǎn)都安裝 psmisc。
yum install -y psmisc
6.?添加環(huán)境變量
# 編輯 ~/.bash_profile 文件,或者在 start-dfs.sh、stop-dfs.sh(hadoop 安裝目錄的 sbin 里)兩個(gè)文件頂部添加這些環(huán)境變量
vim ~/.bash_profile
# 內(nèi)容如下
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. 啟動(dòng) YARN 相關(guān)服務(wù)
# 啟動(dòng) hdfs,在 node1 節(jié)點(diǎn)上執(zhí)行
start-dfs.sh
# node1 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
11506 NameNode
9621 QuorumPeerMain
12373 Jps
12300 DFSZKFailoverController
11023 JournalNode
[root@vvml-yz-hbase-test~]#
# node2 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
16754 DataNode
16405 JournalNode
16909 Jps
15007 QuorumPeerMain
[root@vvml-yz-hbase-test~]#
# node3 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
7026 DataNode
5316 QuorumPeerMain
6699 JournalNode
7197 Jps
[root@vvml-yz-hbase-test~]#
# node4 進(jìn)程
[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. 啟動(dòng) YARN
# 在 node1 節(jié)點(diǎn)上執(zhí)行
start-yarn.sh
# node1 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
11506 NameNode
9621 QuorumPeerMain
13354 Jps
12300 DFSZKFailoverController
12990 ResourceManager
11023 JournalNode
[root@vvml-yz-hbase-test~]#
# node2 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
16754 DataNode
17219 NodeManager
16405 JournalNode
17350 Jps
15007 QuorumPeerMain
[root@vvml-yz-hbase-test~]#
# node3 進(jìn)程
[root@vvml-yz-hbase-test~]#jps
7026 DataNode
5316 QuorumPeerMain
7626 Jps
6699 JournalNode
7483 NodeManager
[root@vvml-yz-hbase-test~]#
# node4 進(jìn)程
[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. 啟動(dòng) MapReduce 任務(wù)歷史服務(wù)
# 在 node1 節(jié)點(diǎn)上執(zhí)行
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 測試驗(yàn)證
1. HDFS NameNode HA 驗(yàn)證
(1)查看 NameNode 節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
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 節(jié)點(diǎn)上(這里是 node1),kill 掉 NameNode 進(jìn)程
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)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
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 狀態(tài)變?yōu)?active。
(4)故障恢復(fù)
# 啟動(dòng) namenode(node1 執(zhí)行)
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)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
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 狀態(tài)變?yōu)?standby。
(6)再次測試自動(dòng)切換
# node4 執(zhí)行
# 模擬故障
jps|grep NameNode|awk '{print $1}'|xargs kill -9
# 確認(rèn)切換
hdfs haadmin -getAllServiceState
# 故障恢復(fù)
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 驗(yàn)證
(1)查看 ResourceManager 節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
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 節(jié)點(diǎn)上(這里是 node1),kill 掉 ResourceManager 進(jìn)程:
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)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
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 狀態(tài)變?yōu)?active。
(4)故障恢復(fù)
# 啟動(dòng) resourcemanager(node1執(zhí)行)
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)查看節(jié)點(diǎn)狀態(tài),任一節(jié)點(diǎn)執(zhí)行
yarn rmadmin -getAllServiceState
# 輸出
[root@vvml-yz-hbase-test~]#yarn rmadmin -getAllServiceState
node1:8033 standby
node4:8033 active
[root@vvml-yz-hbase-test~]#
? ? ? ? node1 狀態(tài)變?yōu)?standby。
(6)再次測試自動(dòng)切換
# node4 執(zhí)行
# 模擬故障
jps|grep ResourceManager|awk '{print $1}'|xargs kill -9
# 確認(rèn)切換
yarn rmadmin -getAllServiceState
# 故障恢復(fù)
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 參數(shù)執(zhí)行手動(dòng)切換主備:文章來源:http://www.zghlxwxcb.cn/news/detail-838130.html
# HDFS NameNode 切換,手動(dòng)指定主備節(jié)點(diǎn)
hdfs haadmin -transitionToStandby --forcemanual nn1
hdfs haadmin -transitionToActive --forcemanual nn2
# YARN ResourceManager 切換,手動(dòng)指定主備節(jié)點(diǎn)
yarn rmadmin -transitionToStandby -forcemanual rm1
yarn rmadmin -transitionToActive -forcemanual rm2
? ? ? ? 一定要謹(jǐn)慎使用 -forcemanual 參數(shù),它可能引起問題,尤其是 YARN ResourceManager HA。在我的測試中,當(dāng)手動(dòng)指定 ResourceManager 主備節(jié)點(diǎn)切換后,停掉 active 節(jié)點(diǎn),standby 不會(huì)變成 active,而是保持 standby 狀態(tài)。再次啟動(dòng)停掉的節(jié)點(diǎn),此時(shí)兩個(gè) ResourceManager 節(jié)點(diǎn)的狀態(tài)都是 standby。只有重啟 yarn 后才能再次正常執(zhí)行自動(dòng)失敗切換。文章來源地址http://www.zghlxwxcb.cn/news/detail-838130.html
參考:
- 大數(shù)據(jù)Hadoop之——Hadoop 3.3.4 HA(高可用)原理與實(shí)現(xiàn)(QJM)
- HDFS High Availability Using the Quorum Journal Manager
- ResourceManager High Availability
到了這里,關(guān)于基于 HBase & Phoenix 構(gòu)建實(shí)時(shí)數(shù)倉(1)—— Hadoop HA 安裝部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!