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 節點為奇數

  1. 防止由腦裂造成的集群不可用
  2. 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

安裝:

鏡像刻錄不進行介紹
請參考:

  1. linux
  2. windows
  3. mac

選擇語言:

在這裡插入圖片描述

採用最小安裝方案

在這裡插入圖片描述 > >在這裡插入圖片描述

設置 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 通就沒問題

windows 修改 host 教程

免密鑰 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 中配置的
  • 按照上面安裝集群的步驟重新安裝即可