HDFS高可用(HA)配置
關於HDFS HA如何進行設計,請檢視——>HDFS高可用(HA)設計,以下的配置也都是根據此文中的設計方式進行配置,所以為了更好的理解下面各個配置的含義,務必先閱讀此文。
對各個節點進行劃分:
選項 | 主機1 | 主機2 | 主機3 |
---|---|---|---|
NameNode | NameNode | ||
JournalNode | JournalNode | JournalNode | |
DataNode | DataNode | DataNode |
此處不再需要SecondaryNameNode,因為SecondaryNameNode的作用時合併映象檔案和日誌檔案,防止下次啟動時讀取資料的速度太慢,而配置高可用之後不需要再次啟動。
這裡的配置將基於之前已經配置過的hadoop分散式叢集進行配置,叢集搭建這裡不再進行討論,至於如何配置hadoop分散式叢集,請檢視——>Hadoop叢集搭建——環境配置
配置HDFS HA
以下的配置也是根據官方文件進行的配置,您也可以直接檢視官方文件
配置core-site.xml
<configuration>
<!--配置客戶端的ns-->
<property>
<name>fs.defaultFS</name>
<value >hdfs://ns1</value>
</property>
<!--臨時目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/bxp/Documents/install/hadoop-2.6.5-hdfsha/data/tmp</value>
</property>
<!--垃圾回收-->
<property>
<name>fs.trash.interval</name>
<value>420</value>
</property>
</configuration>
配置hdfs-site.xml
<configuration>
<!--nameservices,管理namenode的空間-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!--配置nameservices所管理的namenode,即ns1管理的namenode為nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!--配置兩個namenode所在主機-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop-series.bxp.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop-series1.bxp.com:8020</value>
</property>
<!--配置兩個namenode的web 50070埠-->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop-series.bxp.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop-series1.bxp.com:50070</value>
</property>
<!--jernalNode所在主機-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-series.bxp.com:8485;hadoop-series1.bxp.com:8485;hadoop-series2.bxp.com:8485/ns1</value>
</property>
<!--配置客戶端代理-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置兩個namenode之間的隔離方式-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--此處是自己主機的ssh-key路徑
注意:此處使用的是ssh隔離方式,必須提前配置兩個namenode所在主機之間能夠進行無金鑰登陸,否則會失敗
-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/bxp/.ssh/id_rsa</value>
</property>
<!--配置jernal日誌檔案存放在本地磁碟的那個目錄下-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/bxp/Documents/install/hadoop-2.6.5-hdfsha/data/dfs/jn</value>
</property>
<!-- 副本數量不需要進行控制,預設就可以-->
<!--
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
-->
<!-- secondaryNamenode放在第hadoop-series2.bxp.com上-->
<!--
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-series2.bxp.com:50070</value>
</property>
-->
</configuration>
啟動HDFS HA叢集
1、逐個啟動journalnode
sbin/hadoop-daemon.sh start journalnode
2、格式化nn1,並啟動nn1的namenod
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
3、在nn2上執行如下命令從nn1上拷貝格式化生成的映象檔案,並啟動nn2的namenode
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
4、逐個啟動datanode
sbin/hadoop-daemon.sh start datanode
5、將nn1設定為Active NameNode
bin/hdfs haadmin -transitionToActive nn1
Zookeeper實現namenode間自動故障轉移
啟動後都是Standby,通過Zookeeper選舉一個為Active。並通過zookeeper監控兩個namenode。(ZKFC, FailoverController)
1、配置自動故障轉移
hdfs-site.xml中增加如下配置
<!--下面時配置自動故障轉移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
core-site.xml中增加如下配置
<!--指定zookeeper所在主機-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-series.bxp.com:2181,hadoop-series1.bxp.com:2181,hadoop-series2.bxp.com:2181</value>
</property>
2、重新啟動叢集
(1)關閉所有的HDFS服務
(2)啟動Zookeeper叢集
zookeeper-3.5.0-alpha/bin/zkServer.sh start
(3)初始化HA在Zookeeper中狀態
bin/hdfs zkfc -formatZK
初始化成功,會提示 Successfully created /hadoop-ha/ns1 in ZK.
通過zk客戶端進行檢視會發現確實建立了/hadoop-ha/ns1目錄
zookeeper-3.5.0-alpha/bin/zkCli.sh
ls /hadoop-ha
(4)啟動HDFS服務
在各個NameNode節點上啟動DFSZK Failover Controller,現在哪個主機上啟動,那個主機NameNode就是Active NameNode。
sbin/hadoop-daemon start zkfc
(5)驗證自動故障轉移配置成功。
將Active NameNode程序殺死,檢視Standby是否會迅速轉換成Active
kill -9 16299
將Active NameNode網路斷開,檢視Standby是否會迅速轉換成Active
service network stop