2021-07-12

HADOOP+SPARK-HA 安裝

[一、版本 2](#_Toc72997488)

[二、系統架構 2](#_Toc72997489)

[2.1? 服務器架構 2](#_Toc72997490)

[2.2相關的縮寫描述: 3](#_Toc72997491)

[2.3 架構說明 3](#_Toc72997492)

[2.4 NN active 3](#_Toc72997493)

[2.5 NN standby 3](#_Toc72997494)

[2.6 JN 3](#_Toc72997495)

[2.7 zk/zkfs 3](#_Toc72997496)

[三、基礎環境 4](#_Toc72997497)

[3.1、安裝 java 和? psmic 4](#_Toc72997498)

[3.2、服務器分配 4](#_Toc72997499)

[3.3、增加hadoop用戶和免密登陸 4](#_Toc72997500)

[3.4、 上傳安裝包和環境變量 4](#_Toc72997501)

[四、ZOOKEEPER安裝配置 5](#_Toc72997502)

[4.1、 配置conf/zoo.conf文件 5](#_Toc72997503)

[4.2、myid配置 5](#_Toc72997504)

[4.3、配置zookeeper 啟動/查看/停止腳本 6](#_Toc72997505)

[4.4、zookeeper啟動和狀態驗證 6](#_Toc72997506)

[五、HADOOP 安裝配置 6](#_Toc72997507)

[5.1示例配置如下: 6](#_Toc72997508)

[5.2? HADOOP? 初始化、啟動 8](#_Toc72997509)

[六、HADOOP 主備切換測試 9](#_Toc72997510)

[6.1主備狀態查看 9](#_Toc72997511)

[6.2主備狀態切換測試 9](#_Toc72997512)

[七、SPARK 安裝配置 11](#_Toc72997513)

[7.1、spark-env.sh 11](#_Toc72997514)

[7.2、workers 文件 11](#_Toc72997515)

[7.3、log4j.properties 11](#_Toc72997516)

[7.4、啟動spark 11](#_Toc72997517)

[八、SPARK 主備測試 12](#_Toc72997518)

[8.1、spark 主備狀態查看 12](#_Toc72997519)

[8.2、spark 主備切換測試 12](#_Toc72997520)

[九、相關啟動停止測試 13](#_Toc72997521)

[9.1 相關手工啟動 13](#_Toc72997522)

[9.2部分hdfs命令 13](#_Toc72997523)

[9.3部分性能測試命令 14](#_Toc72997524)

##### 一、版本

操作系統--CENTOS 8

hadoop-3.2.2

https://downloads.apache.org/hadoop/core/

spark3.1.1

https://downloads.apache.org/spark/

zookeeper-3.6.3

https://downloads.apache.org/zookeeper/

java-1.8.0-openjdk

##### 二、系統架構

###### 2.1 系統服務架構

![在這里插入圖片描述](media/110e0125

806d6b8222edc55ce2d20bfa.png)

###### 2.2相關的縮寫描述:

HA: High Availabilty 高可用的意思

zk: ZooKeeper 分布式應用程序服務的組件

NN: NameNode 管理文件系統的元數據信息

DN: DataNode 存儲數據的

JN: JournalNode 主要用于NN的數據共享

zkfc: ZooKeeperFailoverControl 監控和管理NN的狀態

###### 2.3 架構說明

HA使用active NN和standby NN兩個節點解決單點問題,

兩個NN節點通過JN集群共享狀態,通過ZKFC選舉active,

監控NN的狀態,實現自動備源,DN會同時向兩個NN節點發送心跳

###### 2.4 NN active

1.接受Client的rpc請求并處理,自己寫一份editlog,同時向JN集群發送一份editlog

2.同時接受DN的塊報告block report, 塊位置更新block location

updates和心跳heartbeat

###### 2.5 NN standby

NN standby是NN active的一個熱備,一旦切換active狀態,可以及時對外提供服務

1.同樣的會接受JN上面的editlog,并執行更新,與NN active的元數據保持同樣的狀態

2.同時接受DN的塊報告block report, 塊位置更新block location

updates和心跳heartbeat

###### 2.6 JN

用于同步active nn和standby

nn之間的數據,本身由一組jn節點組成的集群,一般是奇數,保證高可用,必須有半數以上存活。也就是說如果有3個journalnode,則可以請允許1個down掉,如果有5個的話,可以允許2個down掉。

###### 2.7 zk/zkfs

zk集群一般是奇數,必須有半數以上存活。也就是說如果有3個zk,則可以請允許1個down掉,如果有5個的話,可以允許2個down掉。

zkfc主要用來監控nn節點的健康狀態

zkfc會向zk集群發送心跳,讓自己被選舉,如果自己被選舉主時,會通過rpc調用nn,讓nn變成active狀態

##### 三、基礎環境

###### 3.1、安裝 java 和 psmic

yum install java-1.8.0-openjdk-devel.x86\_64 psmisc -y

說明:Psmisc軟件包包含 fuser, namenode failover 用到

###### 3.2、服務器分配

5臺服務器舉例

| IP? ? ? ? ? ? | HOSNAME? | 節點用途? ? ? |? ? ? ? ? |? ? ? ? ? |? ? ? ? ? ? |

|---------------|----------|----------------|----------|----------|-------------|

| 192.168.2.185 |? master1 | zookeeper/zkfs | namenode |? ? ? ? ? |? ? ? ? ? ? |

| 192.168.2.183 |? master2 | zookeeper/zkfs | namenode |? ? ? ? ? |? ? ? ? ? ? |

| 192.168.2.186 | slave1? | zookeeper? ? ? |? ? ? ? ? | datanode | JournalNode |

| 192.168.2.187 | slave2? |? ? ? ? ? ? ? ? |? ? ? ? ? | datanode | JournalNode |

| 192.168.2.184 | slave3? |? ? ? ? ? ? ? ? |? ? ? ? ? | datanode | JournalNode |

每臺/etc/hosts 添加如下

192.168.2.185 master1

192.168.2.183 master2

192.168.2.186 slave1

192.168.2.187 slave2

192.168.2.184 slave3

###### 3.3、增加hadoop用戶和免密登陸

3.3.1、**每臺**都需要添加hadoop 用戶useradd -m hadoop -s /bin/bash

echo 'greatbit@2021' \| passwd hadoop --stdin

usermod -G wheel hadoop

sed -i 's/\#auth\\s\*required\\s\*pam_wheel.so use_uid/auth required

pam_wheel.so group=wheel/'

/etc/pam.d/su

3.3.2、每臺設置免密登陸

su hadoop 用戶后

\#ssh-keygen -t rsa ssh 版本不同可能導致默認算法無法failover 切換,建議用PEM

\#“RFC4716” (RFC 4716/SSH2 public or private key)

\#“PKCS8” (PEM PKCS8 public key)

ssh-keygen -t rsa -m PEM

ssh-copy-id 本機和其它4臺 都要

###### 3.4、 上傳安裝包和環境變量

3.4.1、安裝包

mkdir –p /phd/bin 目錄

上傳安裝包到master1上,解壓到/phd/bin下,重命名為:Hadoop , spark ,zookeeper

chown –R hadoop: hadoop /phd 改變文件屬主

3.4.2、環境變量

vi /etc/profile

export JAVA_HOME=/usr/lib/jvm/java

export SPARK_HOME=/phd/bin/spark

export HADOOP_HOME=/phd/bin/hadoop

export

PATH=\$PATH:\$JAVA_HOME/bin:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:\$SCALA_HOME/bin

執行:source /etc/profile

##### 四、ZOOKEEPER安裝配置

Hdaoop 用戶下:

###### 4.1、 配置conf/zoo.conf文件

tickTime=2000

dataDir=/phd/tmp/zookeeper

dataLogDir=/phd/bin/zookeeper/logs

clientPort=2181

initLimit=10

syncLimit=5

server.1=master1:2888:3888

server.2=master2:2888:3888

server.3=slave1:2888:3888

說明:server.id=host:port1:port2

其中id為一個數字,表示zk進程的id,這個**id也是dataDir目錄下myid文件的內容**。

host是該zk進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。

###### **4.2、myid配置**

myid文件里面就有一個數據就是 id 的值, Zookeeper

啟動時會讀取這個文件,拿到里面的數據與 zoo.cfg

里面的配置信息比較從而判斷到底是那個 server。

在每臺的/phd/tmp/zookeeper 下分別修改如下:

master1:myid 為 1

master2:myid 為 2

slave1 : myid 為 3

###### 4.3、配置zookeeper 啟動/查看/停止腳本

/phd/bin 下新建 zkServer.sh 755權限

\#!/bin/bash

for host in master1 master2 slave1

do

echo "\$host zkServer.sh \$1"

ssh \$host "source /etc/profile;/phd/bin/zookeeper/bin/zkServer.sh \$1"

done

啟動/查看/停止 腳本

./zkServer.sh start\|status\|stop

###### 4.4、zookeeper啟動和狀態驗證

4.4.1、zookeeper.sh start啟動后

使用zookeeper.sh status查詢三臺如下,一個leader ,兩個follower

Mode: follower

Mode: leader

Mode: follower

4.4.2、啟動后使用jps命令查看3臺zookeeper 狀態

如看到QuorumPeerMain表明zookeeper正在運行。

##### 五、HADOOP 安裝配置

Hdaoop 用戶下:

在master1 上修改/phd/bin/hadoop/etc/hadoop 下配置文件

###### **5.1**示例配置如下:

1.? yarn-env.sh

1.? hadoop-env.sh

2.? core-site.xml

3.? mapred-site.xml

4.? yarn-site.xml

5.? hdfs-site.xml

其中workers中服務器上 的 datanode 存儲位置每臺根據硬盤多少可以不同

>? \<!-- dataode存儲位置 --\>

>? \<property\>

>? \<name\>dfs.datanode.data.dir\</name\>

>? \<value\>/phd/sdb,/phd/sdc,phd/sdd,/phd/sde\</value\>

>? \</property\>

其中master 服務器上的 namenode存儲根據硬盤多少可以添加多個

\<!-- namenode存儲位置 --\>

\<property\>

\<name\>dfs.namenode.name.dir\</name\>

\<value\>/phd/sdb,/phd/sdc\</value\>

\</property\>

1.? workers

\#master1

>? \#master2

>? slave1

>? slave2

>? slave3

在服務器較少時,master 也可以作為workers 存儲配置datanode存儲空間

注意和 namenode 區分存儲目錄或空間

1.? log4j.properties

? ? 日志配置中,統一把級別設置為**ERROR**

1.? 復制/phd/bin/hadoop 到其它服務器

? ? 按需修改 hdfs-site.xml 里datanode 空間

###### 5.2 HADOOP 初始化、啟動

1、在所有JN服務器上啟動journalnode,執行如下命令:

Hdfs --daemon start journalnode

2、創建主備切換命名空間, 格式化zkfc

在master1上執行如下命令:

Hdfs zkfc –formatZK

3、格式化namenode

在master1上執行以下命令:

hdfs namenode –format

4、master1 啟動**主用** namenode

Hdfs --daemon start namenode

5、把NameNode的數據同步到master2 上

Master2 上執行

hdfs namenode –bootstrapStandby

6、啟動 所有

6.1、 確保三臺zk 已啟動

6.2、 cd /phd/bin/hadoop/sbin ; ./start-all.sh

顯示如下:

Starting namenodes on [master1 master2]

Starting datanodes

Starting journal nodes [slave3 slave2 slave1]

Starting ZK Failover Controllers on NN hosts [master1 master2]

Starting resourcemanagers on [ master1 master2]

Starting nodemanagers

6.3 、jps查看啟動進程

Master:

NameNode

ResourceManager

QuorumPeerMain

DFSZKFailoverController

Slave :

JournalNode

NodeManager

DataNode

則安裝成功

##### 六、HADOOP 主備切換測試

###### 6.1主備狀態查看

啟動后查看hadoop主備狀態如下:

Master1: **active**

http://192.168.2.185:9870/dfshealth.html\#tab-overview

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\Catch(05-26-15-05-38).jpg](media/dc0ac0776e85544ee760d0628bbde11e.jpeg)

master2:**standby**

http://192.168.2.183:9870/dfshealth.html\#tab-overview

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\Catch1AC0(05-26-15-05-38).jpg](media/f68b2e038c086c6a4b2b37a9d3014715.jpeg)

###### 6.2主備狀態切換測試

Hdaoop 用戶下:

6.2.1、master1 上停止namenode,模擬進程kill

hdfs --daemon stop namenode

觀察 master2 自動切換為 active

6.2.2、 master1 上再啟動 namenode

hdfs --daemon start namenode

觀察 master1 狀態為standby

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\Catch7A12(05-26-15-05-38).jpg](media/27a38565886dd78c8f3624565a669f21.jpeg)

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\CatchB801(05-26-15-05-38).jpg](media/a8e363f2772a8f45f45898811b1dc38f.jpeg)

5.2.3、重啟 master2 服務器,模擬DOWN機

觀察 master1 自動切換為 active

5.2.4、 master2 重啟動后,手工啟動 namenode

hdfs --daemon start namenode

觀察 master2 狀態為standby

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\Catch39EC(05-26-15-05-38).jpg](media/2f5968a9b39a9da648e49aca9623d913.jpeg)

![C:\\Users\\Administrator\\AppData\\Roaming\\Foxmail7\\Temp-3240-20210526082243\\Attach\\Catch8FF4(05-26-15-05-38).jpg](media/4983462ccb94b0aa70f756c4abfdd3ed.jpeg)

##### 七、SPARK 安裝配置

Hadoop 用戶下,MASTER1上

###### 7.1、spark-env.sh

修改/phd/bin/spark/conf/spark-env.sh

export SPARK_HOME=\$SPARK_HOME

export JAVA_HOME=/usr/lib/jvm/java

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER

\-Dspark.deploy.zookeeper.url=master1:2181,master2:2181 -D

spark.deploy.zookeeper.dir=/spark"

SPARK_LOCAL_DIRS=/phd/tmp/spark

SPARK_PID_DIR=/phd/tmp/spark

SPARK_DRIVER_MEMORY=1G

export SPARK_LIBARY_PATH=.:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib

###### 7.2、workers 文件

master1,master2參與計算如下,不參與注釋掉

master1

master2

slave1

slave2

slave3

###### 7.3、log4j.properties

日志文件類型修改為ERROR

###### 7.4、啟動spark

復制/phd/bin/spark/ 到其余服務器

主master1 上啟動spark

cd /phd/bin/spark/sbin ;./start-all.sh

在master2機器上單獨啟動spark master

cd /phd/bin/spark/sbin ; start-master.sh

master 上jps 查看

Master

Worker

slave 上jps 查看

Worker

##### 八、SPARK 主備測試

###### 8.1、spark 主備狀態查看

Master1

<http://192.168.2.185:8080/>

![](media/3d4fb71fe262798d4eb46473eb7946de.png)

Master2

http://192.168.2.183:8080/

![](media/061d3d95d3b1b8915146f3d253f099c7.png)

###### 8.2、spark 主備切換測試

7.1.1、停止master1上進程 ,模擬進程kill 測試

Hadoop 用戶下:

master1 上停止Master

/phd/bin/spark/sbin/stop-master.sh

master2 自動切換為 alvie

master1 上再啟動Master

/phd/bin/spark/sbin./start-master.sh

master1 變為standby

##### 九、相關啟動停止測試

###### 9.1 相關手工啟動

部分節點down機恢復后,手工加入集群所需啟動的服務如下,注意節點用途不同啟動服務不同

hadoop

hdfs --daemon start namenode

hdfs --daemon start zkfc

hdfs --daemon start datanode

hdfs --daemon start journalnode

yarn --daemon start resourcemanager

yarn --daemon start nodemanager

spark

start-master.sh / stop-master.sh

start-worker.sh / stop-worker.sh

###### 9.2部分hdfs命令

HDFS命令

創建一個文件夾 hdfs dfs -mkdir /myTask

創建多個文件夾 hdfs dfs -mkdir -p /myTask1/input1

上傳文件 hdfs dfs -put /opt/wordcount.txt /myTask/input

查看總目錄下的文件和文件夾 hdfs dfs -ls /

查看myTask下的文件和文件夾 hdfs dfs -ls /myTask

查看myTask下的wordcount.txt的內容 hdfs dfs -cat /myTask/wordcount.txt

刪除總目錄下的myTask2文件夾以及里面的文件和文件夾 hdfs dfs -rmr /myTask2

刪除myTask下的wordcount.txt hdfs dfs -rm -r /myTask/wordcount.txt

下載hdfs中myTask/input/wordcount.txt到本地opt文件夾中 hdfs dfs -get

/myTask/input/wordcount.txt /opt

hdfs haadmin –getAllServiceState

master1:8020 standby

master2:8020 active

hadoop getconf

[-namenodes] gets list of namenodes in the cluster.

[-journalNodes] gets list of journal nodes in the cluster.

###### 9.3部分性能測試命令

\#SPARK 測試(帶主備)

/phd/bin/spark/bin/spark-submit --master spark://master1:7077,master2:7077

/phd/bin/spark/examples/src/main/python/pi.py 200

TestDFSIO用于測試HDFS的IO性能

cd /phd/bin/hadoop

\#測試寫性能 往HDFS中寫入10個100MB的文件

bin/hadoop jar

share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar

TestDFSIO -write -nrFiles 10 -size 100MB -resFile /tmp/TestDFSIOresults.log

\#測試讀性能 HDFS中讀取10個100MB的文件

bin/hadoop jar

share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar

TestDFSIO -read -nrFiles 10 -size 100MB -resFile /tmp/TestDFSIOresults.log

\#刪除測試數據

bin/hadoop jar

share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar

TestDFSIO -clean -resFile /tmp/TestDFSIOresults.log

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容