1. 程式人生 > >【大資料】Hadoop的高可用HA

【大資料】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目錄

[[email protected] 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服務:

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

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

[[email protected] hadoop-2.7.2]$ bin/hdfs namenode -format

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

3)在[nn2],同步nn1的元資料資訊:

[[email protected] hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

4)啟動[nn2]

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

5檢視web頁面顯示 

 

 

6)[nn1],啟動所有datanode

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

7)將[nn1]切換Active

[[email protected] hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

8檢視是否Active

[[email protected] 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/目錄下

[[email protected] software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

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

[[email protected] zookeeper-3.4.10]$ mkdir -p zkData

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

[[email protected] 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的檔案

[[email protected] zkData]$ touch myid

新增myid檔案,注意一定要在linux裡面建立notepad++裡面很可能亂碼

2編輯myid檔案

[[email protected] zkData]$ vi myid

檔案中新增與server的編號:如2

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

[[email protected] zkData]$ scp -r zookeeper-3.4.10/ hadoop103:/opt/module/

[[email protected] zkData]$ scp -r zookeeper-3.4.10/ hadoop104:/opt/module/

分別修改myid檔案中內容為34

4分別啟動zookeeper

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start

5檢視狀態

[[email protected] 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

[[email protected] 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

[[email protected] 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服務:

[[email protected] hadoop-2.7.2]$ sbin/stop-dfs.sh

2)啟動Zookeeper叢集:

[[email protected] hadoop-2.7.2]$ bin/zkServer.sh start

3)初始化HAZookeeper狀態

[[email protected] hadoop-2.7.2]$ bin/hdfs zkfc -formatZK

4)啟動HDFS服務:

[[email protected] hadoop-2.7.2]$ sbin/start-dfs.sh

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

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start zkfc

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

3)驗證:Active NameNode程序kill

[[email protected] 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服務:

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

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

[[email protected] hadoop-2.7.2]$ bin/hdfs namenode -format

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

3)在[nn2],同步nn1的元資料資訊:

[[email protected] hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

4)啟動[nn2]

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

5啟動所有datanode

[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

6)將[nn1]切換Active

[[email protected] hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

4)啟動yarn

1)在hadoop102中執行:

[[email protected] hadoop-2.7.2]$ sbin/start-yarn.sh

2)在hadoop103中執行:

[[email protected] hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

3)檢視服務狀態

[[email protected] 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。隔離性)