Hadoop HA集群 與 開發環境部署
每一次 Hadoop 生態的更新都是如此令人激動
像是 hadoop3x 精簡了內核,spark3 在調用 R 語言的 UDF 方面,速度提升了 40 倍
所以該文章肯定得配備上最新的生態
hadoop 生態簡介
期待目標
環境
OS :
- CentOS 7.4
組件:
- Hadoop 3x 及生態
-
- Yarn
-
- Mapreduce
-
- HDFS
- Zookeeper 3.6.3
可選項
- Hive
- Flume 1.9
- Sqoop 2
- kafka 2x
- Spark 3x
RDMS:
- MySQL 5.7 or 8
開發語言:
- JDK 8
- Python 3.6 64bit
- Scala 2.0 及以上
集群規劃
建議:Zookeeper、JournalNode 節點為奇數
- 防止由腦裂造成的集群不可用
- leader 選舉,要求 可用節點數量 > 總節點數量/2 ,節省資源
注意
Hadoop 安裝有如下三種方式:
- 單機模式:安裝簡單,幾乎不用做任何配置,但僅限於調試用途。
- 偽分布模式:在單節點上同時啟動 NameNode、DataNode、JobTracker、TaskTracker、Secondary Namenode 等 5 個進程,模擬分散式運行的各個節點。
- 完全分散式模式:正常的 Hadoop 集群,由多個各司其職的節點構成。
- HA :在 Hadoop 2.0 之前,在 HDFS 集群中 NameNode 存在單點故障 (SPOF:A Single Point of Failure)。對於只有一個 NameNode 的集群,如果 NameNode 機器出現故障(比如宕機或是軟體、硬體升級),那麼整個集群將無法使用,直到 NameNode 重新啟動
此文採用 HA方案 進行部署
可選方案:
- 多台物理機
- 虛擬機多開
Centos 安裝
環境
此文採用 多台物理機 方案
- 記憶體 2G
- 硬碟 20G
共 4 台物理設備
鏡像下載:
此文採用版本:Centos7.4 x64
建議:百度網盤 centos7.4 密碼: 8jwf
安裝:
鏡像刻錄不進行介紹
請參考:
選擇語言:
採用最小安裝方案
> >
設置 root 密碼
點擊 ROOT PASSWORD 設置 root 密碼,不用添加用戶
> >等待完成
完成之後點擊Reboot > >
虛擬機幫助
該節點為虛擬機的朋友提供幫助
網路配置
虛擬機配置修改
1)共享網路
2)選擇橋接模式
centos 網路配置文件修改
1)查找配置文件
find / -name ifcfg-*
2)修改你 etc 目錄下,並以你網卡名結尾的文件
# 這裡舉例我的
vi /etc/sysconfig/network-scripts/ifcfg-ens33
動態 IP 修改操作:
- 啟用 dhcp
- 注釋 ipaddr 和 gateway
- onboot 設置為 yes
建議做如下修改
修改為靜態 IP
# 修改
BOOTPROTO="static" #dhcp改為static
ONBOOT="yes" #開機啟用本配置
# 添加
IPADDR=192.168.x.x #靜態IP
GATEWAY=192.168.x.x #默認網關
NETMASK=255.255.255.0 #子網掩碼
DNS1=你本機的dns配置 #DNS 配置
3)重啟服務
service network restart
4)ping 一下我的部落格試試
ping uiuing.com
客戶端連接
安裝 net-tools
yum -y install net-tools
查看 ip
ifconfig
打開客戶端終端進行 ssh 連接
ssh root@yourip
安裝開發環境
Mysql
此文採用版本:mysql5.7
安裝依賴
登陸 centos
安裝主要依賴
yum -y install gcc gcc-c++ ncurses ncurses-devel cmake
安裝 boost 庫(可選)
Mysql5.7 版本更新後有很多變化,安裝必須要 BOOST 庫(版本需為 1.59.0)
boost 庫下載地址:boost
1)下載
wget //jaist.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
2)檢查 MD5 值,若不匹配則需要重新下載
md5sum boost_1_59_0.tar.gz
3)解壓
tar -vxzf boost_1_59_0.tar.gz
4)存儲
mv boost_1_59_0 /usr/local/boost_1_59_0
下載
安裝 wget
yum -y install wget
官方下載地址:mysql
1)下載
wget //dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21.tar.gz
2)檢查 MD5 值,若不匹配則需要重新下載
md5sum mysql-5.7.21.tar.gz
編譯安裝
1)解壓
tar -vxzf mysql-5.7.21.tar.gz
2)編譯
cmake .\
make
3)安裝
make install
配置 mysql
啟動
systemctl start mysqld
或者
systemctl start | stop
查看 mysql 狀態
systemctl status mysqld
或者
systemctl status
開機自啟(可選)
systemctl enable mysqld
重載配置(可選)
systemctl daemon-reload
配置 root 密碼
1)生成默認密碼
grep 'temporary password' /var/log/mysqld.log
localhost 後面的就是你的 root 密碼
2)修改密碼
登陸 mysql
mysql -uroot -p你的密碼
修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密碼';
注意:mysql 5.7 默認安裝了密碼安全檢查插件(validate_password),默認密碼檢查策略要求密碼必須包含:大小寫字母、數字和特殊符號,並且長度不能少於8位
以後可以用 update 更新密碼
use mysql;
update user set password=PASSWORD('你的密碼') where user='root';
flush privileges;
添加遠程用戶(可選)
GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;
use mysql;
UPDATE user SET Host='%' WHERE User='用戶名';
flush privileges;
配置文件:/etc/my.cnf
日誌文件:/var/log/mysqld.log
服務啟動腳本:/usr/lib/systemd/system/mysqld.service
socket 文件:/var/run/mysqld/mysqld.pid
JDK
此文採用版本:JDK8
下載
安裝文本編輯器 vim
yum -y install vim
JDK 官方下載地址:oracle jdk
使用命令下載:
wget //download.oracle.com/otn/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-linux-x64.tar.gz?AuthParam=1619936099_3a37c8b389365d286242f4b1aa4967b0
因為 oracle 公司不允許直接通過 wget 下載官網上的 jdk 包
正確做法:
-
通過搜索引擎搜索 jdk 官網下載, 進入 oracle 官網
-
勾選 accept licence agreement ,並選擇你系統對應的版本
-
點擊對應的版本下載,彈出如下下載框,然後複製下載鏈接
這個複製的鏈接結算我們 wget 命令的地址。 -
正確的下載鏈接會有」AuthParam「,這個就是 oracle 公司需要用戶在下載時提供的註冊資訊。而且這個資訊是用時間限制的,過了一段時間後就會失效,如果你想再次下載 jdk 包,只能再次重複上面的操作。
檢查大小
ls -lht
設置環境變數
查看文件名(用於解壓)
ls
創建文件夾
mkdir /usr/local/java
解壓
tar -zxvf 你的jdk包名 -C /usr/local/java/
查看文件名(用於配置環境變數)
ls /usr/local/java
打開配置文件
vi /etc/profile
在末尾添加
# jdk8
# 添加jdk地址變數
JAVA_HOME=/usr/local/java
# 添加jre地址變數
JRE_HOME=${JAVA_HOME}/jre
# 添加java官方庫地址變數
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
# 添加PATH地址變數
PATH=${JAVA_HOME}/bin:$PATH
# 使變數生效
export JAVA_HOME JRE_HOME CLASSPATH PATH
刷新配置文件
source /etc/profile
添加軟鏈接(可選)
ln -s /usr/local/java/jdk1.8.0_291/bin/java /usr/bin/java
檢查
java -version
Python
此文採用版本:Python3.6
我們已經掌握了二進位包安裝的方法,所以我們直接通過 yum 來安裝 Python
yum -y install python36
依賴:python36-libs
安裝 pip3(默認已安裝)
yum install python36-pip -y
檢查
python3 --version
Scala
此文採用版本:Scala2.11.7
請確保已安裝JDK8或者JDK11
下載
Scala 官方下載地址:Scala
使用命令下載:
wget //downloads.lightbend.com/scala/2.11.7/scala-2.11.7.tgz
檢查大小
ls -lht
設置環境變數
查看文件名(用於解壓)
ls
創建文件夾
mkdir /usr/local/scala
解壓
tar -zxvf 你的jdk包名 -C /usr/local/scala/
查看文件名(用於配置環境變數)
ls /usr/local/scala
打開配置文件
vi /etc/profile
在末尾添加
# scala 2.11.7
# 添加scala執行文件地址變數
SCALA_HOME=/usr/local/scala/scala-2.11.7
# 添加PATH地址變數
PATH=$PATH:$SCALA_HOME/bin
# 使變數生效
export SCALA_HOME PATH
刷新配置文件
source /etc/profile
檢查
scala -version
配置 Hadoop Cluster
集群復刻
使用虛擬機的朋友請直接克隆
切記要返回第四步驟更改各節點ip,不然會發生ip衝突
1)備份
前往根目錄
cd /
備份
tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=backup.tgz
備份完成後,在文件系統的根目錄將生成一個名為「backup.tgz」的文件,它的尺寸有可能非常大。你可以把它燒錄到 DVD 上或者放到你認為安全的地方去
在備份命令結束時你可能會看到這樣一個提示:』tar: Error exit delayed from previous
errors』,多數情況下你可以忽略
2)準備
別忘了到其他設備下重新創建那些在備份時被排除在外的目錄(如果不存在):
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys
3)復刻
可選前提:
- 將備份文件拷貝至外存儲
- 到其他設備下掛在外存儲
到其他物理機上恢復文件
tar xvpfz backup.tgz -C /
恢復 SELinux 文件屬性
restorecon -Rv /
集群互聯
HOST 配置
1)修改 hostname
到各設備下執行
# 設備 1 (立即生效)
hostnamectl set-hostname master
# 設備 2 (立即生效)
hostnamectl set-hostname slave1
# 設備 3 (立即生效)
hostnamectl set-hostname slave2
# 設備 4 (立即生效)
hostnamectl set-hostname slave3
2)配置 host 文件
查看各設備 ip(到各設備下執行)
ifconfig
到 master 下打開 host 文件
vim /etc/hosts
末尾追加
master設備的ip master
slave1設備的ip master
slave2設備的ip master
slave3設備的ip master
3)通過 scp 傳輸 host 文件
scp 語法:
scp 文件名 遠程主機用戶名@遠程主機名或ip:存放路徑
到 master 下執行
scp /etc/hosts root@SlaveIP:/etc/
注意:請按照 slave 個數,對其 ip 枚舉傳輸
ping 一下
ping -c 4 slave1
能 ping 通就沒問題
配置無密碼 SSH
以下操作均在master下執行
1)到各設備下生成密鑰
ssh-keygen -t rsa
一路回車
到 master 生成公鑰
cd ~/.ssh/ && cat id_rsa.pub > authorized_keys
之後將各設備的密鑰全複製到authorized_keys文件里
2)通過 scp 傳輸公鑰
到 master 下執行
scp authorized_keys root@SlaveNumbe:~/.ssh/
注意:請按照之前設置的 hostname ,對其 ip 枚舉傳輸
例如: scp authorized_keys root@slave1:~/.ssh/
注意,如果各節點下沒有 ~/.ssh/ 目錄則會配置失敗
檢查
ssh slave1
中斷該 ssh 連接(可選)
exit
客戶端配置(建議)
該配置主要方便客戶端遠程操作
無論是用虛擬機進行學習的朋友,還是工作的朋友都強烈推薦
以下操作均在客戶端(MAC OS)上執行
修改 hots 文件
sudo vim /etc/hosts
將 master 設備下/etc/hosts 之前追加的內容,copy 追加到客戶端 hosts 末尾
ping 一下,能 ping 通就沒問題
免密鑰 ssh 登陸
客戶端生產密鑰:
sudo ssh-keygen -t rsa
打開密鑰
vim ~/.ssh/id_rsa
- 將密鑰的內容追加到 master 設備的 ~/.ssh/authorized_keys 文件內
到 master 內向各節點申請同步
scp authorized_keys root@SlaveNumbe:~/.ssh/
windows ssh 目錄:C:\Users\your_userName.ssh
檢查
ssh master
部署 ZooKeeper
此文採用版本 ZooKeepr3.6.3
官方下載地址:Zookeeper
記得下載帶bin字樣的
準備
從客戶端上下載 壓縮包
到 master 節點上創建 zookeeper 文件夾
mkdir /usr/local/zookeeper
從客戶端上傳到 master
scp 你下載的Zookeeper路徑 root@master:/usr/local/zookeeper
以下操作切換至master節點上
解壓
cd /usr/local/zookeeper
tar xf apache-zookeeper-3.6.3-bin.tar.gz
添加環境變數
打開配置文件
vim /etc/profile
在末尾添加
# ZooKeeper3.6.3
# 添加zookeeper地址變數
ZOOKEEPER_HOME=/usr/local/zookeeper/apache-zookeeper-bin.3.6.3
# 添加PATH地址變數
PATH=$ZOOKEEPER_HOME/bin:$PATH
# 使變數生效
export ZOOKEEPER_HOME PATH
刷新配置文件
source /etc/profile
修改配置
創建數據目錄
mkdir /zookeeper
mkdir /zookeeper/data
mkdir /zookeeper/logs
# 同步
# 自行枚舉
添加配置文件
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
vim $ZOOKEEPER_HOME/conf/zoo.cfg
修改和添加
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/data
dataLogDir=/zookeeper/logs
clientPort=2181
server.1=master:2888:3888
server.2=slea1:2888:3888
server.3=slea2:2888:3888
server.4=slea3:2888:3888:observer
集群部署:
到 master 下執行
請根據節點個數枚舉執行
同步文件
scp /etc/profile root@slave1:/etc/
scp -r /zookeeper root@slave1:/
scp -r /usr/local/zookeeper root@slave1:/usr/local/
配置節點標識
參考資資料:leader 選舉
ssh master "echo "9" > /zookeeper/data/myid"
ssh slave1 "echo "1" > /zookeeper/data/myid"
ssh slave2 "echo "2" > /zookeeper/data/myid"
ssh slave3 "echo "3" > /zookeeper/data/myid"
防火牆配置
#開放埠
firewall-cmd --add-port=2181/tcp --permanent
firewall-cmd --add-port=2888/tcp --permanent
firewall-cmd --add-port=3888/tcp --permanent
#重新載入防火牆配置
firewall-cmd --reload
節點批量執行
# master節點
ssh master "firewall-cmd --add-port=2181/tcp --permanent && firewall-cmd --add-port=2888/tcp --permanent && firewall-cmd --add-port=3888/tcp --permanent && firewall-cmd --reload "
# slave1節點 其他請自行枚舉執行
ssh slave1 "firewall-cmd --add-port=2181/tcp --permanent && firewall-cmd --add-port=2888/tcp --permanent && firewall-cmd --add-port=3888/tcp --permanent && firewall-cmd --reload "
啟動 ZooKeeper
sh $ZOOKEEPER_HOME/bin/zkServer.sh start
編寫批量啟動 shell
vim /bin/zk && chmod 777 /bin/zk
#! /bin/sh
case $1 in
"start"){
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
echo -e "\e[32m...master-start...\033[0m"
ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh start"
echo -e "\e[32m...slave1-start...\033[0m"
ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start"
echo -e "\e[32m...slave2-start...\033[0m"
ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start"
echo -e "\e[32m...slave3-start...\033[0m"
ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start"
echo -e "\e[32m...all-start-end...\033[0m"
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
};;
"stop"){
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
echo -e "\e[32m...master-stop...\033[0m"
ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop"
echo -e "\e[32m...slave1-start...\033[0m"
ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop"
echo -e "\e[32m...slave2-start...\033[0m"
ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop"
echo -e "\e[32m...slave3-start...\033[0m"
ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop"
echo -e "\e[32m...all-stop-end...\033[0m"
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
};;
"status"){
echo -e "\e[32m---------------------------------------------------------------------------"
echo -e "\e[32m...master-status...\033[0m"
ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh status"
echo -e "\e[32m...slave1-start...\033[0m"
ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status"
echo -e "\e[32m...slave2-start...\033[0m"
ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status"
echo -e "\e[32m...slave3-start...\033[0m"
ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status"
echo -e "\e[32m...all-status-end...\033[0m"
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
};;
esac
命令
# 啟動
zk start
# 查看狀態
zk status
# 關閉
zk stop
啟動之後 MODE 和我的顯示一樣就算成功了
部署 Hadoop
此文採用版本 Hadoop3.2.2
官方下載地址:Hadoop
準備
從客戶端上下載 壓縮包
到 master 節點上創建 Hadoop 文件夾
mkdir /usr/local/hadoop
從客戶端上傳到 master
scp 你下載的hadoop路徑 root@master:/usr/local/hadoop
以下操作切換至master節點上
解壓
cd /usr/local/hadoop
tar xf hadoop包名
添加環境變數
打開配置文件
vim /etc/profile
在末尾添加
# Hadoop 3.2.2
# 添加hadoop地址變數
HADOOP_HOME=/usr/local/hadoop/hadoop-3.3.0
# 添加PATH地址變數
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使變數生效
export HADOOP_HOME PATH
# IF HADOOP >= 3x / for root
# HDFS
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_ZKFC_USER=root
# YARN
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
# run
export HDFS_DATANODE_USER HADOOP_SECURE_DN_USER HDFS_NAMENODE_USER HDFS_SECONDARYNAMENODE_USER HDFS_ZKFC_USER YARN_RESOURCEMANAGER_USER HADOOP_SECURE_DN_USER YARN_NODEMANAGER_USER
請自行使用scp將文件同步至各節點
刷新配置文件
source /etc/profile
配置
創建數據目錄
mkdir /hadoop
mkdir /hadoop/journaldata
mkdir /hadoop/hadoopdata
# 同步
# 自行枚舉
添加 Jdk 環境
打開文件
vim /usr/local/hadoop/hadoop-3.3.0/etc/hadoop/hadoop-env.sh
添加或修改
export JAVA_HOME=/usr/local/java
接下來我們要修改的文件:
- core-site.xml
- hadoop-env.sh
- mapred-env.sh
- yarn-env.sh
- workers
前往配置文件目錄
cd /usr/local/hadoop/hadoop-3.3.0/etc/hadoop/
core-site.xml
<configuration>
<!--指定hdfs nameservice-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://jed</value>
</property>
<!--指定hadoop工作目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/hadoopdata</value>
</property>
<!--指定zookeeper集群訪問地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!--不超過datanode節點數的副本數-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--與core-site.xml中一致的hdfs nameservice-->
<property>
<name>dfs.nameservices</name>
<value>jed</value>
</property>
<!--jed的NameNode,nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.jed</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.jed.nn1</name>
<value>master:9000</value>
</property>
<!-- nn1 的 http 通訊地址 -->
<property>
<name>dfs.namenode.http-address.jed.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2 的 RPC 通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.jed.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn2 的 http 通訊地址 -->
<property>
<name>dfs.namenode.http-address.jed.nn2</name>
<value>slave1:50070</value>
</property>
<!-- 指定NameNode的edits元數據在JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/jed</value>
</property>
<!-- 指定 JournalNode 在本地磁碟存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/journaldata</value>
</property>
<!-- 開啟 NameNode 失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<!-- 此處配置較長,在安裝的時候切記檢查不要換行-->
<property>
<name>dfs.client.failover.proxy.provider.jed</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制佔用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用 sshfence 隔離機制時需要 ssh 免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/var/root/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔離機制超時時間(20s) -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>20000</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<!-- 指定 mr 框架為 yarn 方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 設置 mapreduce 的歷史伺服器地址和埠號 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- mapreduce 歷史伺服器的 web 訪問地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<!--給mapreduce & app配置路徑-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 開啟 RM 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定 RM 的 cluster id,可以自定義-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>Cyarn</value>
</property>
<!-- 指定 RM 的名字,可以自定義 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定 RM 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>slave2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave3</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave3</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
<!-- 要運行 MapReduce 程式必須配置的附屬服務 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 開啟 YARN 集群的日誌聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- YARN 集群的聚合日誌最長保留時長 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<!--1天-->
<value>86400</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.ZKRMStateStore</value>
</property>
</configuration>
workers
注意!在Hadoop3x以前的版本是 slaves 文件
master
slave1
slave2
slave3
使用 scp 分發給其他節點
scp -r /usr/local/hadoop slave1:/usr/local/
請自行枚舉執行
檢查
使用之前的 zk 腳本啟動 zeekeeper 集群
zk start
分別在每個 journalnode 節點上啟動 journalnode 進程
# master slave1 slave2
hadoop-daemon.sh start journalnode
在第一個 namenode 節點上格式化文件系統
hadoop namenode -format
同步兩個 namenode 的元數據
查看你配置的 hadoop.tmp.dir 這個配置資訊,得到 hadoop 工作的目錄,我的是/hadoop/hadoopdata/
把 master 上的 hadoopdata 目錄發送給 slave1 的相同路徑下,這一步是為了同步兩個 namenode 的元數據
scp -r /hadoop/hadoopdata slave1:/hadoop/
也可以在 slave1 執行以下命令:
hadoop namenode -bootstrapStandby
格式化 ZKFC(任選一個 namenode 節點格式化)
hdfs zkfc -formatZK
啟動 hadoop 集群
start-all.sh
相關命令請前往 $HADOOP_HOME/sbin/ 查看
啟動 mapreduce 任務歷史伺服器
mr-jobhistory-daemon.sh start historyserver
編寫 jps 集群腳本
vim /bin/jpall && chmod 777 /bin/jpall
#! /bin/sh
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
echo -e "\e[32m...master-jps...\033[0m"
ssh master "jps"
echo -e "\e[32m...slave1-jps...\033[0m"
ssh slave1 "jps"
echo -e "\e[32m...slave2-jps...\033[0m"
ssh slave2 "jps"
echo -e "\e[32m...slave3-jps...\033[0m"
ssh slave3 "jps"
echo -e "\e[32m...all-jps-end...\033[0m"
echo -e "\e[32m---------------------------------------------------------------------------\033[0m"
運行
jpall
查看各節點的主備狀態
hdfs haadmin -getServiceState nn1
查看 HDFS 狀態
hdfs dfsadmin -report
WEB 訪問可以直接瀏覽器: IP:50070
測試
HDFS
上傳一個文件
hdfs dfs -put test.out
check
hdfs dfs -ls /user/root
hadoop fs -rm -r -skipTrash /user/root/test.out
刪除
Mapreduce
我們使用 hadoop 自帶的圓周率測試
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 5 5
運行結果
高可用
查看進程
jps
殺死進程
kill -9 5114
現在 master 已不是 namenode 了
現在 slave1 變成了主節點
恢復 master 節點
hadoop-daemon.sh start namenode
master 變成了 standby,什麼 HA 具備
Hadoop HA 集群的重裝
-
刪除所有節點中 hadoop 的工作目錄(core-site.xml 中配置的 hadoop.tmp.dir 那個目錄)
-
如果你在 core-site.xml 中還配置了 dfs.datanode.data.dir 和 dfs.datanode.name.dir 這兩個配置,那麼把這兩個配置對應的目錄也刪除
-
刪除所有節點中 hadoop 的 log 日誌文件,默認在 HADOOP_HOME/logs 目錄下
-
刪除 zookeeper 集群中所關於 hadoop 的 znode 節點
圖中的紅色框中 rmstore 這個節點不能刪除,刪除另外兩個就可以
- 重新格式化 ZKFC 的時候會詢問是否覆蓋 rmstore 這個節點,輸入 yes 即可
- 刪除所有節點中的 journaldata,路徑是在 hdfs-site.xml 中的 dfs.journalnode.edits.dir 中配置的
- 按照上面安裝集群的步驟重新安裝即可