第8章 HDFS HA 高可用8.1 HA概述8.2 HDFS-HA工做機制8.2.1 HDFS-HA工做要點8.2.2 HDFS-HA手動故障轉移工做機制8.2.3 HDFS-HA自動故障轉移工做機制8.3 HDFS-HA集羣配置8.3.1 環境準備8.3.2 規劃集羣8.3.3 配置Zookeeper集羣8.3.4 配置HDFS-HA集羣8.3.5 啓動HDFS-HA集羣8.3.6 配置HDFS-HA自動故障轉移8.4 YARN-HA配置8.4.1 YARN-HA工做機制8.4.2 配置YARN-HA集羣8.5 HDFS Federation(聯邦) 架構設計html
消除單點故障
。HA嚴格來講應該分紅各個組件的HA機制:HDFS的HA和YARN的HA。Active/Standby
兩個NameNodes實如今集羣中對NameNode的熱備
來解決上述問題。若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將NameNode很快的切換到另一臺機器。經過雙NameNode消除單點故障。node
brain split(腦裂)現象
的發生。hdfs haadmin -failover
手動進行故障轉移,在該模式下,即便現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。自動故障轉移爲HDFS部署增長了兩個新組件(進程):ZooKeeper和ZKFailoverController(ZKFC)進程,以下圖所示。一、修改ip
二、修改主機名及主機名和ip地址的映射
三、關閉防火牆
四、ssh免密登陸
五、安裝JDK,配置環境變量等linux
一、集羣規劃
在hadoop10二、hadoop103和hadoop104三個節點上部署Zookeeper。
二、解壓安裝
(1)解壓Zookeeper安裝包到/opt/module/目錄下nginx
[atguigu@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(2)同步/opt/module/zookeeper-3.4.10/目錄內容到hadoop10三、hadoop104web
[atguigu@hadoop102 module]$ xsync zookeeper-3.4.10/
三、配置服務器編號
(1)在/opt/module/zookeeper-3.4.10/這個目錄下建立zkDatasql
[atguigu@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData
(2)在/opt/module/zookeeper-3.4.10/zkData目錄下建立一個myid的文件shell
[atguigu@hadoop102 zkData]$ touch myid
添加myid文件,注意必定要在linux裏面建立,在notepad++裏面極可能亂碼。
(3)編輯myid文件apache
[atguigu@hadoop102 zkData]$ vim myid
在文件中添加與server對應的編號:bootstrap
2
(4)拷貝配置好的zookeeper到其餘機器上vim
[atguigu@hadoop102 zkData]$ xsync myid
並分別在hadoop10二、hadoop103上修改myid文件中內容爲三、4
四、配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg爲zoo.cfg
[atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打開zoo.cfg文件
[atguigu@hadoop102 conf]$ vim zoo.cfg
修改數據存儲路徑配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增長以下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(3)同步zoo.cfg配置文件
[atguigu@hadoop102 conf]$ xsync zoo.cfg
(4)配置參數解讀
server.A=B:C:D。
A是一個數字,表示這個是第幾號服務器;
集羣模式下配置一個文件myid,這個文件在dataDir目錄下,這個文件裏面有一個數據就是A的值,Zookeeper啓動時讀取此文件,拿到裏面的數據與zoo.cfg裏面的配置信息比較從而判斷究竟是哪一個server。
B是這個服務器的ip地址;
C是這個服務器與集羣中的Leader服務器交換信息
的端口;
D是萬一集羣中的Leader服務器掛了,須要一個端口來從新進行選舉,選出一個新的Leader,而這個端口就是用來執行選舉時
服務器相互通訊的端口。
四、集羣操做
(1)分別啓動Zookeeper
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start
(2)查看狀態
[atguigu@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[atguigu@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[atguigu@hadoop104 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
一、官方地址:http://hadoop.apache.org/
二、在opt目錄下建立一個HA文件夾
mkdir HA
三、將/opt/app/下的 hadoop-2.7.2拷貝到/opt/ha目錄下
cp -r hadoop-2.7.2/ /opt/HA/
四、配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
五、配置core-site.xml
<configuration>
<!-- Hadoop FS客戶端在沒有給出時使用的默認路徑前綴 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
</property>
<!-- 指定JournalNode守護程序將存儲其本地狀態的路徑 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/HA/hadoop-2.7.2/data/tmp/jn</value>
</property>
<configuration>
六、配置hdfs-site.xml
<configuration>
<!-- 徹底分佈式集羣邏輯名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 配置逗號分隔的NameNode ID列表。DataNodes將使用它來肯定集羣中的全部NameNode。 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 要監聽的每一個NameNode的徹底限定的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:8020</value>
</property>
<!-- 要監聽的每一個NameNode的徹底限定HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:50070</value>
</property>
<!-- 標識NameNodes將寫入/讀取編輯的JournalNodes組的URI -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property>
<!-- HDFS客戶端用於聯繫Active NameNode的Java類 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 關閉權限檢查,實際開發中不能這麼作-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 配置隔離機制,即同一時刻只能有一臺服務器對外響應 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時須要ssh無祕鑰登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/atguigu/.ssh/id_rsa</value>
</property>
</configuration>
七、拷貝配置好的hadoop環境到其餘節點(分發)
[atguigu@hadoop102 module]$ xsync HA/
一、在各個JournalNode節點上,輸入如下命令啓動journalnode服務
[atguigu@hadoop102 hadoop-2.7.2]$ pwd
/opt/module/HA/hadoop-2.7.2
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode
[atguigu@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode
編寫查看journalnode服務節點進程的shell腳本util.sh,腳本文件放在/home/atguigu/bin/目錄下
#!/bin/bash
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
echo "========== $i =========="
ssh $i '/opt/module/jdk1.8.0_144/bin/jps'
done
二、在[nn1]上,對其進行格式化,並啓動
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
三、在[nn2]上,同步nn1的元數據信息
[atguigu@hadoop103 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby
四、啓動[nn2]
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
五、查看web頁面顯示,以下圖所示
hadoop102(standby)
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode
七、將[nn1]切換爲Active
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1
八、查看是否Active
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1
hadoop102(active)
注意:
HDFS-HA手動故障轉移須要確保namenode兩個進程都存在的狀況下!
一、具體配置
(1)在hdfs-site.xml中增長
<!-- 開啓自動故障轉移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(2)在core-site.xml文件中增長
<!-- 設置zookeeper仲裁 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
注意:
修改配置文件後,記得要分發。
二、啓動
(1)關閉全部HDFS服務:
[atguigu@hadoop102 hadoop-2.7.2]$ pwd
/opt/module/HA/hadoop-2.7.2
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh
(2)啓動Zookeeper集羣:(使用自定義編寫的shell腳本,腳本文件放在/home/atguigu/bin/目錄下)
[atguigu@hadoop102 hadoop-2.7.2]$ zkstart.sh
zkstart.sh
#!/bin/bash
echo "========== 正在啓動zookeeper集羣 =========="
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
ssh $i 'source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh start'
done
zkstatus.sh
#!/bin/bash
echo "========== 正在查看zookeeper集羣狀態 =========="
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
ssh $i 'source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh status'
done
zkstop.sh
#!/bin/bash
echo "========== 正在中止zookeeper集羣 =========="
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
ssh $i 'source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop'
done
(3)初始化HA在Zookeeper中狀態:
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs zkfc -formatZK
(4)啓動HDFS服務:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
(5)在各個NameNode節點上啓動DFSZKFailoverController,先在哪臺機器啓動,哪一個機器的NameNode就是Active NameNode
sbin/hadoop-daemin.sh start zkfc
三、驗證
(1)將Active NameNode進程kill
[atguigu@hadoop102 hadoop-2.7.2]$ kill -9 namenode的進程id
單個啓動namenode節點
[atguigu@hadoop103 hadoop-2.7.2]$ pwd
/opt/module/HA/hadoop-2.7.2
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
(2)將Active NameNode機器斷開網絡
[atguigu@hadoop102 hadoop-2.7.2]$ service network stop
四、自動故障轉移上傳數據測試
在任意HDFS服務器上上傳文件,例如在103上
[atguigu@hadoop103 hadoop-2.7.2]$ bin/hadoop fs -put NOTICE.txt /
而後切換Active後,在網頁上查看。測試成功!
一、官方文檔:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
二、YARN-HA工做機制,以下圖所示
一、環境準備
(1)修改IP
(2)修改主機名及主機名和IP地址的映射
(3)關閉防火牆
(4)ssh免密登陸
(5)安裝JDK,配置環境變量等
(6)配置Zookeeper集羣
二、規劃集羣
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--啓用resourcemanager HA-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<!--指定zookeeper集羣的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</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>
(2)同步更新其餘節點的配置信息。
四、第一次啓動hdfs服務時須要作的事情以下
(1)在各個JournalNode節點上,輸入如下命令啓動journalnode服務:
sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,對其進行格式化,並啓動:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步nn1的元數據信息:
bin/hdfs namenode -bootstrapStandby
(4)啓動[nn2]:
sbin/hadoop-daemon.sh start namenode
(5)啓動全部DataNode
sbin/hadoop-daemons.sh start datanode
(6)將[nn1]切換爲Active
bin/hdfs haadmin -transitionToActive nn1
注意:
若不是第一次啓動hdfs服務,不須要作上述事情,直接命令sbin/start-dfs.sh
便可
五、啓動YARN
(1)在hadoop102中執行:
sbin/start-yarn.sh
(2)在hadoop103中執行:
sbin/yarn-daemon.sh start resourcemanager
(3)查看服務狀態,以下圖所示:
bin/yarn rmadmin -getServiceState rm1
YARN的服務狀態
注意:
須要保證兩個ResourceManager在啓動的狀況下,纔可使用YARN-HA。會自動跳轉到Active主機上。
一、NameNode架構的侷限性
(1)Namespace(命名空間)的限制
因爲NameNode在內存中存儲全部的元數據(metadata),所以單個NameNode所能存儲的對象(文件+塊)數目受到NameNode所在JVM的heap size的限制。50G的heap可以存儲20億(200million)個對象,這20億個對象支持4000個DataNode,12PB的存儲(假設文件平均大小爲40MB)。隨着數據的飛速增加,存儲的需求也隨之增加。單個DataNode從4T增加到36T,集羣的尺寸增加到8000個DataNode。存儲的需求從12PB增加到大於100PB。
(2)隔離問題
因爲HDFS僅有一個NameNode,沒法隔離各個程序,所以HDFS上的一個實驗程序就頗有可能影響整個HDFS上運行的程序。
(3)性能的瓶頸
因爲是單個NameNode的HDFS架構,所以整個HDFS文件系統的吞吐量受限於單個NameNode的吞吐量。
二、HDFS Federation架構設計,以下圖所示
能不能有多個NameNode?
三、HDFS Federation應用思考 不一樣應用可使用不一樣NameNode進行數據管理。 例如:圖片業務、爬蟲業務、日誌審計業務。 Hadoop生態系統中,不一樣的框架使用不一樣的NameNode進行管理NameSpace。(隔離性)