大資料Hadoop學習筆記(六)
阿新 • • 發佈:2018-11-09
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無密碼登陸
- 必須保證兩個NM之間能夠ssh無密碼登陸
- 如何保證兩個NM資料一致同步呢?
- 關鍵在編輯檔案edits
- 如何保證edits檔案的安全性和可靠性?(
- HA核心)
- activeNM往共享檔案中寫入,standbyNM從共享檔案中讀取
- 編輯日誌儲存在zookeeper(主要因為zk是基數臺機器)的journalNode程序。如果有n個機器寫入成功,則代表standbyNM可以去共享檔案中讀取。
- 如何保證兩個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命令:
- sbin/hadoop-daemon.sh start datanode
- -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)
- 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
掌握下面的這張圖: