大數據技術之_07_Hadoop學習_HDFS_HA(高可用)_HA概述+HDFS-HA工做機制+HDFS-HA集羣配置+YARN-HA配置+HDFS Federation(聯邦) 架構設計

第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


第8章 HDFS HA 高可用

8.1 HA概述

  • 1)所謂HA(High Available),即高可用(7*24小時不中斷服務)。
  • 2)實現高可用最關鍵的策略是消除單點故障。HA嚴格來講應該分紅各個組件的HA機制:HDFS的HA和YARN的HA。
  • 3)Hadoop2.0以前,在HDFS集羣中NameNode存在單點故障(SPOF)。
  • 4)NameNode主要在如下兩個方面影響HDFS集羣:
    • NameNode機器發生意外,如宕機,集羣將沒法使用,直到管理員重啓。
    • NameNode機器須要升級,包括軟件、硬件升級,此時集羣也將沒法使用。
  • HDFS HA功能經過配置Active/Standby兩個NameNodes實如今集羣中對NameNode的熱備來解決上述問題。若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將NameNode很快的切換到另一臺機器。

8.2 HDFS-HA工做機制

  經過雙NameNode消除單點故障。node

8.2.1 HDFS-HA工做要點

  • 一、元數據管理方式須要改變
    內存中各自保存一份元數據;
    Edits日誌只有Active狀態的NameNode節點能夠作寫操做;
    兩個NameNode均可以讀取Edits;
    共享的Edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現)。
  • 二、須要一個狀態管理功能模塊
    實現了一個zkfailover,常駐在每個namenode所在的節點,每個zkfailover負責監控本身所在NameNode節點,利用zk進行狀態標識,當須要進行狀態切換時,由zkfailover來負責切換,切換時須要防止brain split(腦裂)現象的發生。
  • 三、必須保證兩個NameNode之間可以ssh無密碼登陸。
  • 四、隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務。

8.2.2 HDFS-HA手動故障轉移工做機制

8.2.3 HDFS-HA自動故障轉移工做機制

  • 前面學習了使用命令hdfs haadmin -failover手動進行故障轉移,在該模式下,即便現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。自動故障轉移爲HDFS部署增長了兩個新組件(進程):ZooKeeper和ZKFailoverController(ZKFC)進程,以下圖所示。
  • ZooKeeper是維護少許協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的如下功能:
    • 1)故障檢測:集羣中的每一個NameNode在ZooKeeper中維護了一個持久會話,若是機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另外一個NameNode須要觸發故障轉移。
    • 2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於惟一的選擇一個節點爲active狀態。若是目前現役NameNode崩潰,另外一個節點可能從ZooKeeper得到特殊的`排外鎖`以代表它應該成爲現役NameNode。
  • ZKFC是自動故障轉移中的另外一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每一個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:
    • 1)健康監測:ZKFC使用一個健康檢查命令按期地`ping`與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認爲該節點是健康的。若是該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點爲非健康的。
    • 2)ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。若是本地NameNode處於active狀態,ZKFC也保持一個特殊的`znode鎖`,該鎖使用了ZooKeeper對`短暫節點`的支持,若是會話終止,鎖節點將自動刪除。
    • 3)基於ZooKeeper的選擇:若是本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將爲本身獲取該鎖。若是成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地NameNode爲Active。故障轉移進程與前面描述的手動故障轉移類似,首先若是必要保護以前的現役NameNode,而後本地NameNode轉換爲Active狀態。

8.3 HDFS-HA集羣配置

8.3.1 環境準備

一、修改ip
二、修改主機名及主機名和ip地址的映射
三、關閉防火牆
四、ssh免密登陸
五、安裝JDK,配置環境變量等linux

8.3.2 規劃集羣

8.3.3 配置Zookeeper集羣

一、集羣規劃
  在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

8.3.4 配置HDFS-HA集羣

一、官方地址: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/

8.3.5 啓動HDFS-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)


hadoop103(standby)

六、在[nn1]上,啓動全部datanode
[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兩個進程都存在的狀況下!

8.3.6 配置HDFS-HA自動故障轉移

一、具體配置
(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後,在網頁上查看。測試成功!

8.4 YARN-HA配置

8.4.1 YARN-HA工做機制

一、官方文檔:
  http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
二、YARN-HA工做機制,以下圖所示

8.4.2 配置YARN-HA集羣

一、環境準備
(1)修改IP
(2)修改主機名及主機名和IP地址的映射
(3)關閉防火牆
(4)ssh免密登陸
(5)安裝JDK,配置環境變量等
(6)配置Zookeeper集羣
二、規劃集羣


三、具體配置
(1)yarn-site.xml
<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主機上。

8.5 HDFS Federation(聯邦) 架構設計

一、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。(隔離性)

相關文章
相關標籤/搜索