HDFS 系列七:HDFS HA 高可用

7. HDFS HA 高可用

7.1 HA 概述

所謂 HA(high available),即高可用(7*24小時不中斷服務)

實現高可用最關鍵的策略是消除單點故障,HA 嚴格來說應該分成各個組件的 HA 機制:HDFS的HA 和 YARN的HA

Hadoop2.0 之前,在 HDFS 集羣中 NameNode 存在單點故障(SPOF)

NameNode 主要在以下兩個方面影響 HDFS 集羣

1. NameNode 機器發生意外,如宕機,集羣將無法使用,直到管理員重啓
2. NameNode 機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用

HDFS HA 功能通過配置 Active/Standby 兩個 NameNodes 實現在集羣中對 NameNode 的熱備來解決上述問題

如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將 NameNode 很快的切換到另外一臺機器

注意:HDFS 配置 HA 後,SecondNamenode 的角色被備用 Namenode 所包含,備用 Namenode 爲活動的 Namenode 命名空間設置週期性的檢查點

7.2 HDFS-HA 工作機制

通過雙 NameNode 消除單點故障

7.3 HDFS-HA 手動故障轉移

7.3.1 HDFS-HA 工作要點

  1. 元數據管理方式需要改變:

    內存中各自保存一份元數據

    Edits 日誌只有 Active 狀態的 Namenode 節點可以做寫操作

    兩個 Namenode 都可以讀取 edits

    共享的 edits 放在一個共享存儲中管理(qjournal 和 NFS 兩個主流實現)

  2. 需要一個狀態管理功能模塊

    實現了一個 zkfailover,常駐在每一個 Namenode 所在的節點,每一個 zkfailover 負責監控自己所在 Namenode 節點,利用 zk 進行狀態標識,當需要進行狀態切換時,由 zkfailover 來負責切換,切換時需要防止 brain split 現象的發生

  3. 必須保證兩個 NameNode 之間能夠 ssh 無密碼登錄

  4. 隔離(Fence),即同一時刻僅僅有一個 NameNode 對外提供服務

7.3.2 環境準備

將上面 master、slave1、slave2 三個機器克隆修改相關配置即可,要點如下:

  1. 修改 IP (可以保持不變)、主機名(改爲 hadoop-1,hadoop-2,hadooop-3)

    hadoop-1 192.168.27.101
    hadoop-2 192.168.27.102
    hadoop-3 192.168.27.103
    
  2. 修改主機名及主機名和 IP 地址的映射

  3. 關閉防火牆

  4. ssh 免密登錄

  5. 清空 Hadoop 的 data 和 logs

7.3.3 集羣規劃

hadoop-1 hadoop-2 hadooop-3
NameNode NameNode -
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
- ResourceManager -
NodeManager NodeManager NodeManager

7.3.4 配置 HDFS-HA 集羣(以三臺爲例)

  1. 官方地址:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

  2. 配置 core-site.xml

    <configuration>
        <!-- 把兩個 NameNode 的地址組裝成一個集羣 mycluster -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mycluster</value>
        </property>
    
        <!-- 聲明 journalnode 服務本地文件系統存儲目錄-->
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/usr/local/hadoop/tmp/dfs/data/jn</value>
        </property>
    
        <!-- 指定 hadoop 運行時產生文件的存儲目錄(和之前一樣) -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/hadoop/tmp</value>
        </property>
    </configuration>
    
  3. 配置 hdfs-site.xml

    <configuration>
    
        <!-- 完全分佈式集羣名稱 -->
        <property>
            <name>dfs.nameservices</name>
            <value>mycluster</value>
        </property>
    
        <!-- 集羣中 NameNode 節點都有哪些 -->
        <property>
            <name>dfs.ha.namenodes.mycluster</name>
            <value>nn1,nn2</value>
        </property>
    
        <!-- nn1 的 RPC 通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn1</name>
            <value>hadoop-1:8020</value>
        </property>
    
        <!-- nn2 的 RPC 通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn2</name>
            <value>hadoop-2:8020</value>
        </property>
    
        <!-- nn1 的 http 通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn1</name>
            <value>hadoop-1:50070</value>
        </property>
    
        <!-- nn2 的 http 通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn2</name>
            <value>hadoop-2:50070</value>
        </property>
    
        <!-- 指定 NameNode 元數據在 JournalNode 上的存放位置 -->
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://hadoop-1:8485;hadoop-2:8485;hadoop-3:8485/mycluster</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>/root/.ssh/id_rsa</value>
        </property>
    
        <!-- 關閉權限檢查-->
        <property>
            <name>dfs.permissions.enable</name>
            <value>false</value>
        </property>
    
        <!-- 訪問代理類:client,mycluster,active 配置失敗自動切換實現方式-->
        <property>
            <name>dfs.client.failover.proxy.provider.mycluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
    </configuration>
    
  4. 拷貝配置好的 hadoop 環境到其他節點

7.3.5 啓動 HDFS-HA 集羣

  1. 在各個 JournalNode 節點上,輸入以下命令啓動 JournalNode 服務

    [root@hadoop-1 hadoop]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out
    [root@hadoop-1 hadoop]# jps
    2709 Jps
    2648 JournalNode
    
    [root@hadoop-2 hadoop]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out
    [root@hadoop-2 hadoop]# jps
    2578 JournalNode
    2639 Jps
    
    [root@hadoop-3 hadoop]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out
    [root@hadoop-3 hadoop]# jps
    2946 JournalNode
    3007 Jps
    
  2. 在 [nn1] 上,對其進行格式化,並啓動

    [root@hadoop-1 hadoop]# hdfs namenode -format
    
    [root@hadoop-1 hadoop]# hadoop-daemon.sh start namenode
    starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
    

    目前 hadoop-1 已啓動,爲 standby 狀態,如下圖

    image

  3. 在 [nn2] 上,同步 nn1 的元數據信息

    [root@hadoop-2 hadoop]# hdfs namenode -bootstrapStandby
    

    可以從日誌看出從 [nn1] 進行同步,如下圖:

    image

  4. 啓動 [nn2]

    [root@hadoop-2 hadoop]# hadoop-daemon.sh start namenode
    

    目前 hadoop-2 已啓動,也爲 standby 狀態,如下圖

    image

  5. 在 [nn1] 上,啓動所有 Datanode

    [root@hadoop-1 .ssh]# hadoop-daemons.sh start datanode
    

    備註:hadoop-daemons 本質是到 slaves 文件中找所有 DataNode

    此時所有 Namenode 都是 standby 狀態,不支持讀文件

    image

  6. 將 [nn1] 切換爲 Active

    [root@hadoop-1 .ssh]# hdfs haadmin -transitionToActive nn1
    
  7. 查看是否 Active

    [root@hadoop-1 .ssh]# hdfs haadmin -getServiceState nn1
    active
    

    image

7.3.6 HDFS-HA 集羣手動故障轉移

  1. 強殺 Active NameNode [nn1]

    [root@hadoop-1 hadoop]# jps
    4389 Jps
    2648 JournalNode
    3112 NameNode
    4091 DataNode
    [root@hadoop-1 hadoop]# kill -9 3112
    
  2. 手動 將 [nn2] 切爲 Active

    [root@hadoop-1 hadoop]# hdfs haadmin -transitionToActive nn2
    
    20/03/07 16:49:45 INFO ipc.Client: Retrying connect to server: hadoop-1/192.168.27.101:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
    Unexpected error occurred  Call From hadoop-1/192.168.27.101 to hadoop-1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
    Usage: haadmin [-ns <nameserviceId>] [-transitionToActive [--forceactive] <serviceId>]
    

    發現 Connection refused,因爲爲了防止腦裂,[nn2] 必須和 [nn1] 取得聯繫,但是此時 [nn1] 已掛,所以必須先把 [nn1] 先啓動,再手動將 [nn2] 切爲 Active

  3. 啓動 [nn1]

    [root@hadoop-1 hadoop]# hadoop-daemon.sh start namenode
    starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
    

    此時 [nn1] 和 [nn2] 都是 standyby 狀態

  4. 手動 將 [nn2] 切爲 Active

    [root@hadoop-1 hadoop]# hdfs haadmin -transitionToActive nn2
    

    image

7.4 HDFS-HA 自動故障轉移

7.4.1 工作要點

前面使用命令 hdfs haadmin -failover 手動進行故障轉移,在該模式下,即使現役 NameNode 已經失效,系統也不會自動從現役 NameNode 轉移到待機 NameNode,下面配置部署 HA 自動進行故障轉移

自動故障轉移爲 HDFS 部署增加了兩個新組件:ZooKeeperZKFailoverController(ZKFC) 進程

ZooKeeper 是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務

7.4.2 ZooKeeper 在 自動故障轉移 中的作用

7.4.2.1 故障檢測

集羣中的每個 NameNode 在 ZooKeeper 中維護了一個持久會話,如果機器崩潰,ZooKeeper 中的會話將終止,ZooKeeper 通知另一個 NameNode 需要觸發故障轉移

7.4.2.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 狀態

image

7.4.3 環境準備

將上面 master、slave1、slave2 三個機器克隆修改相關配置即可,要點如下:

  1. 修改 IP (可以保持不變)、主機名(改爲 hadoop-1,hadoop-2,hadooop-3)

    hadoop-1 192.168.27.101
    hadoop-2 192.168.27.102
    hadoop-3 192.168.27.103
    
  2. 修改主機名及主機名和 IP 地址的映射

  3. 關閉防火牆

  4. ssh 免密登錄

  5. 清空 Hadoop 的 data 和 logs

7.4.4 規劃集羣

hadoop-1 hadoop-2 hadoop-3
NameNode NameNode -
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
- ResourceManager -
NodeManager NodeManager NodeManager

7.4.5 配置 Zookeeper 集羣

7.4.5.1 Zookeeper 集羣規劃

在 hadoop-1、hadoop-2 和 hadoop-3 三個節點上部署 Zookeeper

7.4.5.2 解壓安裝

  1. 解壓 Zookeeper 安裝包到 /usr/zookeeper/ 目錄下

    [root@hadoop-1 zookeeper]# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/zookeeper/
    
  2. 在 /usr/zookeeper/zookeeper-3.4.14 這個目錄下創建 zkData

    [root@hadoop-1 zookeeper-3.4.14]# mkdir -p zkData
    
  3. 複製 /usr/zookeeper/zookeeper-3.4.14/conf 這個目錄下的 zoo_sample.cfg 爲 zoo.cfg

    [root@hadoop-1 conf]# cp zoo_sample.cfg zoo.cfg
    

7.4.5.3 配置 zoo.cfg 文件

  1. 具體配置

    dataDir=/usr/zookeeper/zookeeper-3.4.14/zkData

    增加如下配置

    #######################cluster##########################
    server.1=hadoop-1:2888:3888
    server.2=hadoop-2:2888:3888
    server.3=hadoop-3:2888:3888
    
  2. 配置參數解讀

    Server.A=B:C:D

    A 是一個數字,表示這個是第幾號服務器

    B 是這個服務器的 ip 地址

    C 是這個服務器與集羣中的 Leader 服務器交換信息的端口

    D 是萬一集羣中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口

    集羣模式下配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面有一個數據就是 A 的值,Zookeeper 啓動時讀取此文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是哪個 server

  3. 集羣操作

    A. 在 /usr/zookeeper/zookeeper-3.4.14/zkData 目錄下創建一個 myid 的文件

    touch myid
    

    添加 myid 文件,注意一定要在 linux 裏面創建,在 notepad++ 裏面很可能亂碼

    B. 編輯 myid 文件

    vim myid
    

    在文件中添加與 server 對應的編號:如 1

    C. 拷貝配置好的 zookeeper 到其他機器上

    scp -r /usr/zookeeper/zookeeper-3.4.14/ root@hadoop-2:/usr/zookeeper/zookeeper-3.4.14/
    scp -r /usr/zookeeper/zookeeper-3.4.14/ root@hadoop-3:/usr/zookeeper/zookeeper-3.4.14/
    

    並分別修改myid文件中內容爲 2、3

    D. 分別啓動 zookeeper

    [root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh start
    [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh start
    [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh start
    

    E. 查看狀態

    [root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg
    Mode: follower
    
    [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg
    Mode: follower
    
    [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg
    Mode: leader
    

    hadoop-1、hadoop-2 爲 follower,hadoop-3 爲 leader

7.4.6 配置 HDFS-HA 集羣(以三臺爲例)

  1. 官方地址:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

  2. 配置 core-site.xml

    在前面手動 HA 配置的基礎上,新增 [core-site.xml] 配置

    <property>
    	<name>ha.zookeeper.quorum</name>
    	<value>hadoop-1:2181,hadoop-2:2181,hadoop-3:2181</value>
    </property>
    
  3. 配置 hdfs-site.xml

    在前面手動 HA 配置的基礎上,新增 [hdfs-site.xml] 配置

    <property>
    	<name>dfs.ha.automatic-failover.enabled</name>
    	<value>true</value>
    </property>
    
  4. 拷貝配置好的 hadoop 環境到其他節點

7.4.7 啓動

  1. 關閉所有 HDFS 服務

    [root@hadoop-1 hadoop-2.9.2]# stop-dfs.sh
    
  2. 啓動 Zookeeper 集羣

    [root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh start
    [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh start
    [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh start
    

    檢查 ZK 啓動狀態,一個 leader,兩個 follower

  3. 初始化 HA 在 Zookeeper 中狀態

    [root@hadoop-1 hadoop-2.9.2]# hdfs zkfc -formatZK
    

    image

    初始化 ZK 的 HA 狀態後,可到 ZK 上確認 hadoop-ha 目錄存在,並且 mycluster 集羣已被 ZK 管理

    [root@hadoop-2 hadoop-2.9.2]# cd /usr/zookeeper/zookeeper-3.4.14/
    [root@hadoop-2 zookeeper-3.4.14]# bin/zkCli.sh
    ......
    [zk: localhost:2181(CONNECTED) 0] ls /
    [zookeeper, hadoop-ha]
    [zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
    [mycluster]
    
  4. 啓動 HDFS 服務:

    [root@hadoop-1 hadoop-2.9.2]# start-dfs.sh
    Starting namenodes on [hadoop-1 hadoop-2]
    hadoop-1: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
    hadoop-2: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-2.out
    hadoop-1: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-1.out
    hadoop-3: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-3.out
    hadoop-2: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-2.out
    Starting journal nodes [hadoop-1 hadoop-2 hadoop-3]
    hadoop-1: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out
    hadoop-2: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out
    hadoop-3: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out
    Starting ZK Failover Controllers on NN hosts [hadoop-1 hadoop-2]
    hadoop-1: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-1.out
    hadoop-2: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-2.out
    

    啓動 HDFS 服務,觀察啓動日誌,發現主要啓動了:

    (1) namenodes : [hadoop-1 hadoop-2]

    (2) journal nodes : [hadoop-1 hadoop-2 hadoop-3]

    (3) ZK Failover Controllers : [hadoop-1 hadoop-2] (ZKFC 跟着 NN 走)

    在各個節點上 jps 觀察所有組件啓動成功,在 web 界面觀察兩個 Namenode 的狀態

    image

    image

    NameNode 先啓動的就是 Active 狀態

7.4.8 驗證

  1. 將 Active NameNode 進程 kill

    [root@hadoop-1 hadoop-2.9.2]# jps
    5028 DataNode
    2581 QuorumPeerMain
    5607 Jps
    5256 JournalNode
    5465 DFSZKFailoverController
    4910 NameNode
    [root@hadoop-1 hadoop-2.9.2]# kill -9 4910
    

    但是遺憾發現,Namenode1 被 kill 之後,Namenode2 並沒有啓動,解決方式見: 7.4.9 HDFS-HA 自動故障轉移失敗的原因

    ,到 Namenode2 節點上看 hadoop-root-zkfc-hadoop-2.log 日誌

  2. 將 Active NameNode 機器斷開網絡

    service network stop
    

觀察上述兩個場景下的 HDFS-HA 自動故障轉移

7.4.9 HDFS-HA 自動故障轉移失敗的原因

如果發現 HA 配置沒有問題,但是不能自動切換 active 的 Namenode,我們可以查看 zkfc 的 log 日誌,看是否會出現下面的 Warn 或者 Exception:

image

hadoop-2 ssh 到 hadoop-1 上,嘗試連接到 8020 這個 rpc 端口,但是因爲 hadoop-1 上的 Namenode 進程被關了,自然連不上

hadoop-2 使用了 fuser 工具,但是裝的 Centos 是最小化安裝,並不包含 fuser,所以需要在所有 Namenode 機器(hadoop-1,hadoop-2)上安裝 fuser

[root@hadoop-1 logs]# yum install psmisc
[root@hadoop-2 logs]# yum install psmisc

7.5 YARN-HA 配置

7.5.1 YARN-HA 工作機制

  1. 官方文檔

https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

  1. YARN-HA 工作機制

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0GuSX3dm-1583649732230)(https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/images/rm-ha-overview.png)]

7.5.2 配置 YARN-HA 集羣

7.5.2.1 環境準備

在前面 Hdfs HA 的基礎上進行配置

7.5.2.2 規劃集羣

和前面 Hdfs HA 的集羣的基礎上規劃:hadoop-1 和 hadoop-2 上配置 active/standby ResourceManager

hadoop-1 hadoop-2 hadoop-3
NameNode NameNode -
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager -
NodeManager NodeManager NodeManager

7.5.2.3 配置 yarn-site.xml

[yarn-site.xml]

<configuration>

	<!-- Site specific YARN configuration properties -->

	<!-- reducer 獲取數據的方式 -->
	<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-yarn</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop-1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop-2</value>
    </property>
 
    <!--指定zookeeper集羣的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop-1:2181,hadoop-2:2181,hadoop-3: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>
	
	<!-- 忽略虛擬內存檢查,如果實在實體機上,並且內存夠多,可以去掉 -->
	<property>
		<name>yarn.nodemanager.vmen-check-enabled</name>
		<value>false</value>
	</property>

</configuration>

同步更新其他節點的配置信息

7.4.2.4 啓動 Hdfs

前置狀態:ZK 集羣已起,Hadoop 未起

  1. 啓動 Hdfs

    [root@hadoop-1 hadoop]# start-dfs.sh 
    Starting namenodes on [hadoop-1 hadoop-2]
    hadoop-1: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
    hadoop-2: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-2.out
    hadoop-1: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-1.out
    hadoop-3: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-3.out
    hadoop-2: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-2.out
    Starting journal nodes [hadoop-1 hadoop-2 hadoop-3]
    hadoop-1: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out
    hadoop-3: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out
    hadoop-2: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out
    Starting ZK Failover Controllers on NN hosts [hadoop-1 hadoop-2]
    hadoop-1: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-1.out
    hadoop-2: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-2.out
    

    注意,此處 namenodes 在 [hadoop-1 hadoop-2] 都起來了!

  2. 啓動 Yarn

    因爲配置了 ResourceManager 在 hadoop-1、hadoop-2 上,所以在 hadoop-2 上啓動效果一樣

    [root@hadoop-2 hadoop]# yarn-daemon.sh start resourcemanager
    starting resourcemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-resourcemanager-hadoop-2.out
    
    [root@hadoop-2 hadoop]# jps
    24064 DataNode
    24432 ResourceManager
    24688 Jps
    4995 QuorumPeerMain
    23978 NameNode
    24314 DFSZKFailoverController
    24174 JournalNode
    

    確認 ResourceManager 在 hadoop-2 上啓動成功,可再次在 web 端確認:

    image

    但是和 Hdfs HA 不一樣,此時 hadoop-1 上並不會啓動 ResourceManager,需要我們再次啓動

    [root@hadoop-1 hadoop]# yarn-daemon.sh start resourcemanager
    starting resourcemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-resourcemanager-hadoop-1.out
    
  3. 查看服務狀態

    [root@hadoop-3 hadoop]# yarn rmadmin -getServiceState rm1
    standby
    
    [root@hadoop-3 logs]# yarn rmadmin -getServiceState rm2
    active
    

    可見 rm2 是 active 狀態

7.5 HDFS Federation 架構設計

7.5.1 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 的吞吐量

7.5.2 HDFS Federation 架構設計

能不能有多個NameNode

NameNode NameNode NameNode
元數據 元數據 元數據
Log machine 電商數據/話單數據

7.5.3 HDFS Federation 應用思考

不同應用可以使用不同 NameNode 進行數據管理

圖片業務、爬蟲業務、日誌審計業務

Hadoop 生態系統中,不同的框架使用不同的 NameNode 進行管理 Namespace(隔離性)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章