【大數據】Hadoop的高可用HA


1HA高可用

1.1 HA概述

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

2)實現高可用最關鍵策略是消除單點故障(single point of failureSPOF。單點故障是一個組件發生故障,就會導致整個系統無法運行。HA嚴格來說應該分成各個組件的HA機制HDFSHAYARNHA

3Hadoop2.0之前,在HDFS集群中NameNode存在單點故障

4)NameNode主要在以下兩個方面影響HDFS集群

NameNode機器發生意外,如宕機,集群將無法使用,直到管理員重啟

NameNode機器需要升級,包括軟件、硬件升級,此時集群也將無法使用

HDFS HA功能通過配置Active/Standby兩個nameNodes實現在集群中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一台機器。

1.2 工作機制

配置兩個namenode,通過雙namenode消除單點故障。

1.3 HDFS-HA手動故障轉移

1.3.1 工作要點

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

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

Edits日志只有Active狀態的namenode節點可以做寫操作;

兩個namenode都可以讀取edits

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

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

3)隔離Fence同一時刻僅僅有一個NameNode對外提供服務,防止腦裂(split-brain)

1.3.2 環境准備

1)修改IP

2)修改主機名及主機名和IP地址的映射

3)關閉防火牆

4ssh免密登錄

5)安裝JDK,配置環境變量等

1.3.3 規划集群

 

 

hadoop102

hadoop103

hadoop104

HDFS

 

NameNode

DataNode

JournalNode

NameNode

DataNode

JournalNode

 

DataNode

JournalNode

YARN

 

NodeManager

ResourceManager

NodeManager

 

NodeManager

 

1.3.4 配置HDFS-HA集群

1官方地址:http://hadoop.apache.org/

2在/opt/module/目錄下創建一個HA文件夾

mkdir HA

3將/opt/module/下 hadoop-2.7.2拷貝/opt/module/HA目錄

[atguigu@hadoop102 module]$ cp -r hadoop-2.7.2/ /opt/module/HA/

4配置hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144

5配置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>/opt/module/HA/hadoop-2.7.2/data/jn</value>

</property>

 

<!-- 指定hadoop運行時產生文件的存儲目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>

</property>

</configuration>

6配置hdfs-site.xml

<configuration>

<!-- 完全分布式集群名稱 -->

<property>

<name>dfs.nameservices</name>

<value>mycluster</value>

</property>

 

<!-- 該nameservice下NameNode節點都有哪些 -->

<property>

<name>dfs.ha.namenodes.mycluster</name>

<value>nn1,nn2</value>

</property>

 

<!-- nn1RPC通信地址 -->

<property>

<name>dfs.namenode.rpc-address.mycluster.nn1</name>

<value>hadoop102:8020</value>

</property>

 

<!-- nn2RPC通信地址 -->

<property>

<name>dfs.namenode.rpc-address.mycluster.nn2</name>

<value>hadoop103:8020</value>

</property>

 

<!-- nn1http通信地址 -->

<property>

<name>dfs.namenode.http-address.mycluster.nn1</name>

<value>hadoop102:50070</value>

</property>

 

<!-- nn2http通信地址 -->

<property>

<name>dfs.namenode.http-address.mycluster.nn2</name>

<value>hadoop103:50070</value>

</property>

 

<!-- 指定NameNode元數據在JournalNode上的存放位置 -->

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104: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>/home/atguigu/.ssh/id_rsa</value>

</property>

 

<!-- 關閉權限檢查-->

<property>

<name>dfs.permissions.enable</name>

<value>false</value>

</property>

 

<!-- 客戶端訪問代理類:客戶端通過該類判斷哪個namenodeactive -->

<property>

   <name>dfs.client.failover.proxy.provider.mycluster</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

</configuration>

7拷貝配置好的hadoop環境到其他節點

1.3.5 啟動HDFS-HA集群

1在各個JournalNode節點上,輸入以下命令啟動journalnode服務:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

2)在[nn1],對其進行格式化,並啟動:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

3)在[nn2],同步nn1的元數據信息:

[atguigu@hadoop103 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

4)啟動[nn2]

[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

5查看web頁面顯示 

 

 

6)[nn1],啟動所有datanode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

7)將[nn1]切換Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

8查看是否Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1

1.4 HDFS-HA自動故障轉移

1.4.1工作要點

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

自動故障轉移為HDFS部署增加了兩個新組件:ZooKeeperZKFailoverControllerZKFC)進程。ZooKeeper是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。

HA的自動故障轉移依賴於ZooKeeper的以下功能:

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

2現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode

ZKFC是自動故障轉移中的另一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:

1健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回復健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。

2ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支持,如果會話終止,鎖節點將自動刪除。

3基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地NameNodeactive。故障轉移進程與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然后本地NameNode轉換為active狀態。

 

 

 

1.4.2 規划集群

 

 

hadoop102

hadoop103

hadoop104

HDFS

 

NameNode

DataNode

JournalNode

ZKFC

NameNode

DataNode

JournalNode

ZKFC

 

DataNode

JournalNode

YARN

 

NodeManager

ResourceManager

NodeManager

 

NodeManager

Zookeeper

Zookeeper

Zookeeper

Zookeeper

 

1.4.3 配置Zookeeper集群

0)集群規划

在hadoop102、hadoop103和hadoop104三個節點上部署Zookeeper。

1解壓安裝

1)解壓zookeeper安裝包到/opt/module/目錄下

[atguigu@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

2)在/opt/module/zookeeper-3.4.10/這個目錄下創建zkData

[atguigu@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData

3)重命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg為zoo.cfg

[atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg

2)配置zoo.cfg文件

1)具體配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################

server.2=hadoop102:2888:3888

server.3=hadoop103:2888:3888

server.4=hadoop104:2888:3888

2)配置參數解讀

Server.A=B:C:D。

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

B是這個服務器的ip地址;

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

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

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

3)集群操作

1/opt/module/zookeeper-3.4.10/zkData目錄下創建一個myid的文件

[atguigu@hadoop102 zkData]$ touch myid

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

2編輯myid文件

[atguigu@hadoop102 zkData]$ vi myid

文件中添加與server的編號:如2

3)拷貝配置好的zookeeper到其他機器上

[atguigu@hadoop102 zkData]$ scp -r zookeeper-3.4.10/ hadoop103:/opt/module/

[atguigu@hadoop102 zkData]$ scp -r zookeeper-3.4.10/ hadoop104:/opt/module/

分別修改myid文件中內容為34

4分別啟動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

5查看狀態

[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@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: leader

[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

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

1)具體配置

1)在hdfs-site.xml中增加

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

2)在core-site.xml文件中增加

<property>

<name>ha.zookeeper.quorum</name>

<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>

</property>

注意:記得分發配置文件

2)啟動

1)關閉所有HDFS服務:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh

2)啟動Zookeeper集群:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/zkServer.sh start

3)初始化HAZookeeper狀態

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs zkfc -formatZK

4)啟動HDFS服務:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

5)在各個NameNode節點上啟動DFSZK Failover Controller,先在哪台機器啟動,哪個機器的NameNode就是Active NameNode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start zkfc

說明:如果使用start-dfs.sh啟動集群,不需要單獨啟動zkfc

3)驗證:Active NameNode進程kill

[atguigu@hadoop102 hadoop-2.7.2]$ kill -9 namenode的進程id

1.5 YARN-HA配置

1.5.1 YARN-HA工作機制

1)官方文檔:

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2YARN-HA工作機制

 

 

1.5.2 配置YARN-HA集群

0)環境准備

1)修改IP

2)修改主機名及主機名和IP地址的映射

3)關閉防火牆

4ssh免密登錄

5)安裝JDK,配置環境變量等

6)配置Zookeeper集群

1規划集群

 

hadoop102

hadoop103

hadoop104

HDFS

 

NameNode

DataNode

JournalNode

ZKFC

NameNode

DataNode

JournalNode

ZKFC

 

DataNode

JournalNode

YARN

 

ResourceManager

NodeManager

ResourceManager

NodeManager

 

NodeManager

Zookeeper

Zookeeper

Zookeeper

Zookeeper

 

2)具體配置

1yarn-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)同步更新其他節點配置信息

3啟動hdfs 

1在各個JournalNode節點上,輸入以下命令啟動journalnode服務:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

2)在[nn1],對其進行格式化,並啟動:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

3)在[nn2],同步nn1的元數據信息:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

4)啟動[nn2]

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

5啟動所有datanode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

6)將[nn1]切換Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

4)啟動yarn

1)在hadoop102中執行:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh

2)在hadoop103中執行:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

3)查看服務狀態

[atguigu@hadoop102 hadoop-2.7.2]$ bin/yarn rmadmin -getServiceState rm1

 

 

1.6 HDFS Federation架構設計

1) NameNode架構的局限性

1Namespace(命名空間)限制

由於NameNode在內存中存儲所有的元數據(metadata因此單個namenode所能存儲的對象(文件+塊)數目受到namenode所在JVMheap size的限制。50Gheap能夠存儲20200million對象,這20個對象支持4000datanode12PB的存儲(假設文件平均大小為40MB隨着數據的飛速增長,存儲的需求也隨之增長。單個datanode4T增長到36T,集群的尺寸增長到8000datanode。存儲的需求從12PB增長到大於100PB

2隔離問題

由於HDFS僅有一個namenode,無法隔離各個程序因此HDFS上的一個實驗程序就很有可能影響整個HDFS運行的程序。

3性能的瓶頸

由於是單個namenodeHDFS架構,因此整個HDFS文件系統的吞吐量受限於單個namenode的吞吐量。

2HDFS Federation架構設計

不能有多個NameNode

NameNode NameNode NameNode

數據數據數據

Log machine 電商數據/話單數據

 

 

3HDFS Federation應用思考

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

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

Hadoop生態系統中,不的框架使用不同的namenode進行管理namespace。隔離性)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM