1. 程式人生 > >大資料Hadoop學習筆記(六)

大資料Hadoop學習筆記(六)

HDFS HA


背景:

在hadoop2.0之前,HDFS叢集中的NameNode存在單點故障(SPOF)對於只有一個NameNode的叢集,若NameNode機器出現故障,則整個叢集將無法使用,直到NameNode重新啟動

  • NameNode主要在一下兩方面影響叢集:
    • NM機器發生意外
    • NM機器需要升級

HDFS HA通過配置Active/Standby兩個NM實現在叢集中對NM的熱備份來解決上述問題。

HDFS HA設計

配置HA要點:

  • share edits
    • journalNode
  • NameNode(active、standby)
  • client proxy
    • proxy代理管理NM地址,客戶端請求時,通過proxy去尋找active的NameNode
  • fence 隔離
    • 同一時刻僅僅有一個NM對外提供服務
    • 使用sshfence
      • 必須保證兩個NM之間能夠ssh無密碼登陸
        6-1
  • 如何保證兩個NM資料一致同步呢?
    • 關鍵在編輯檔案edits
  • 如何保證edits檔案的安全性和可靠性?(
  • HA核心)
    • activeNM往共享檔案中寫入,standbyNM從共享檔案中讀取
    • 編輯日誌儲存在zookeeper(主要因為zk是基數臺機器)的journalNode程序。如果有n個機器寫入成功,則代表standbyNM可以去共享檔案中讀取。
    • 6-2
  • 如何保證兩個NM不搶佔工作?
    • 配置NameNode隔離性

配置

規劃叢集

. hdp-node-01 hdp-node-02 hdp-node-03
HDFS NameNode NameNode
. DataNode DataNode DataNode
. JournalNode JournalNode JournalNode
YARN ResourceManager
. NodeManager NodeManager NodeManager
MapReduce JobHistoryServer

步驟:

官網連結

  • 準備環境(在之前分散式檔案基礎上修改)
    • 先將之前分散式檔案備份(每臺機器)
      • cp -r hadoop-2.5.0/ dist-hadoop-2.5.0
      • mv hadoop-2.5.0/data/tmp/ dist-tmp
      • mkdir hadoop-2.5.0/data/tmp
    • hdfs-site.xml
<configuration>
	<property>
	  <name>dfs.nameservices</name>
	  <value>mycluster</value>
	</property>

	<property>
	  <name>dfs.ha.namenodes.mycluster</name>
	  <value>nn1,nn2</value>
	</property>

	<!-- NameNode RPC ADDRESS -->
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
	  <value>hdp-node-01:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
	  <value>hdp-node-02:8020</value>
	</property>

	<!-- NameNode HTTP WEB ADDRESS -->
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn1</name>
	  <value>hdp-node-01:50070</value>
	</property>
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn2</name>
	  <value>hdp-node-02:50070</value>
	</property>

	<!-- NameNode SHARED EDITS ADDRESS -->
	<property>
	  <name>dfs.namenode.shared.edits.dir</name>
	  <value>qjournal://hdp-node-01:8485;hdp-node-02:8485;hdp-node-03:8485/mycluster</value>
	</property>

	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/opt/app/hadoop-2.5.0/data/dfs/jn</value>
	</property>

	<!-- HDFS PROXY CLIENT -->
	<property>
	  <name>dfs.client.failover.proxy.provider.mycluster</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>

	<!-- HDFS SSH FENCE -->
	<property>
	  <name>dfs.ha.fencing.methods</name>
	  <value>sshfence</value>
	</property>
	<property>
	  <name>dfs.ha.fencing.ssh.private-key-files</name>
	  <value>/root/.ssh/id_rsa</value>
	</property>


</configuration>
  • core-site.xml
<configuration>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/app/hadoop-2.5.0/data/tmp</value>
    </property>
	
</configuration>

啟動

  • 將修改的配置檔案同步到其他機器:
    • scp -r etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml [email protected]:/opt/app/hadoop-2.5.0/etc/hadoop/
    • scp -r etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml [email protected]:/opt/app/hadoop-2.5.0/etc/hadoop/
  • step 1:啟動三臺機器的journalnode
    • sbin/hadoop-daemon.sh start journalnode
  • step 2:將nn1格式化,並啟動
    • bin/hdfs namenode -format
    • sbin/hadoop-daemon.sh start namenode
  • step 3:在nn2上,同步nn1的元資料資訊
    • bin/hdfs namenode -bootstrapStandby
  • step 4:啟動nn2
    • sbin/hadoop-daemon.sh start namenode
  • step 5:將nn1切換為active
    • bin/hdfs haadmin -transitionToActive nn1
  • step 6:在nn1上啟動所有的datanode
    • sbin/hadoop-daemon.sh start datanode
      bin/hdfs haadmin命令:
  • -transitionToActive 使狀態變成active
  • -transitionToStandby 使狀態變成standby
  • -failover [–forcefence] [–forceactive]
  • -getServiceState 檢視狀態
  • -checkHealth
  • -help

HA 自動故障轉移

. hdp-node-01 hdp-node-02 hdp-node-03
HDFS NameNode NameNode
. ZKFC ZKFC
. DataNode DataNode DataNode
. JournalNode JournalNode JournalNode
YARN ResourceManager
. NodeManager NodeManager NodeManager
MapReduce JobHistoryServer
  • 啟動以後都是standby
    • 選舉一個為active
  • 監控
    • ZKFC (zookeeper failoverController)
      在這裡插入圖片描述
  • 如果zkservice掛了會影響系統工作麼?
    -不會。zkfc相當於zk的客戶端,是配置在HDFS上的

配置檔案

  • hdfs-site.xml
	<!-- automatic failover  -->
	 <property>
	   <name>dfs.ha.automatic-failover.enabled</name>
	   <value>true</value>
	</property>
  • core-site.sml
	<property>
	   <name>ha.zookeeper.quorum</name>
	   <value>hdp-node-01:2181,hdp-node-02:2181,hdp-node-03:2181</value>
	</property> 

啟動

  • 關閉所有的HDFS服務 sbin/stop-dfs.sh
  • 同步配置檔案
  • 啟動zk叢集:bin/zkServer.sh start
  • 初始化HA在zk中狀態:bin/hdfs zkfc -formatZK
    • 在zk中建立了 /hadoop-ha/mycluster檔案
  • 啟動HDFS服務:sbin/start-dfs.sh
  • 在這裡插入圖片描述

掌握下面的這張圖:
在這裡插入圖片描述