在Hadoop 1.0中,HDFS的單NameNode設計帶來諸多問題,包括單點故障、內存受限制約集羣擴展性和缺少隔離機制(不一樣業務使用同一個NameNode致使業務相互影響)等,爲了解決這些問題,Hadoop 2.0引入了基於共享存儲的HA解決方案和HDFS Federation,這裏重點介紹HDFS Federation。node
HDFS Federation是指HDFS集羣可同時存在多個NameNode,這些NameNode分別管理一部分數據,且共享全部DataNode的存儲資源。這種設計可解決單NameNode存在的如下幾個問題:apache
(1)HDFS集羣擴展性。多個NameNode分管一部分目錄,使得一個集羣能夠擴展到更多節點,再也不像1.0中那樣因爲內存的限制制約文件存儲數目。bootstrap
(2)性能更高效。多個NameNode管理不一樣的數據,且同時對外提供服務,將爲用戶提供更高的讀寫吞吐率。centos
(3)良好的隔離性。用戶可根據須要將不一樣業務數據交由不一樣NameNode管理,這樣不一樣業務之間影響很小。ssh
須要注意的,HDFS Federation並不能解決單點故障問題,也就是說,每一個NameNode都存在在單點故障問題,你須要爲每一個namenode部署一個backup namenode以應對NameNode掛掉對業務產生的影響。ide
因爲HDFS federation仍然存在單點故障問題,因此咱們考慮HA和HDFS federation共同搭建。各個節點角色分配以下:oop
用戶名性能 |
ip地址spa |
NameNode設計 (active) |
secondarynamenode |
NameNode (standby) |
JournalNode |
DataNode |
Zookeeper |
歸屬組 |
centos94 |
192.168.1.94 |
Y |
Y |
|
|
Y |
|
cloud-1 |
centos105 |
192.168.1.105 |
|
Y |
Y |
|
Y |
|
|
centos95 |
192.168.1.95 |
Y |
Y |
|
Y |
Y |
Y |
cloud-2 |
centos112 |
192.168.1.112 |
|
Y |
Y |
Y |
Y |
Y |
|
centos111 |
192.168.1.111 |
|
|
|
Y |
Y |
Y |
|
軟件版本:
hadoop:hadoop-2.2.0.tar.gz(利用源碼自編譯後適用於64位系統)
zookeeper:zookeeper-3.4.6.tar.gz
前期具體的安裝環境準備請參考文檔:《Hadoop、HBase、Hive整合安裝文檔》
下面主要是一些參數設置:
HA + Federation,全部節點共同部分hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/admin/hadoop-2.2.0/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/admin/hadoop-2.2.0/dfs/data</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>cloud-1, cloud-2</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.ha.namenodes.cloud-1</name>
<value>centos94,centos105</value>
</property>
<property>
<name>dfs.ha.namenodes.cloud-2</name>
<value>centos95,centos112</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cloud-1.centos94</name>
<value>centos94:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cloud-1.centos94</name>
<value>centos94:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cloud-1.centos105</name>
<value>centos105:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cloud-1.centos105</name>
<value>centos105:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cloud-2.centos95</name>
<value>centos95:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cloud-2.centos95</name>
<value>centos95:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cloud-2.centos112</name>
<value>centos112:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cloud-2.centos112</name>
<value>centos112:50070</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/admin/hadoop-2.2.0/tmp/journal</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/admin/.ssh/id_rsa</value>
</property>
在cloud-1和cloud-2中不同的配置:
cloud-1
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos95:8485;centos111:8485;centos112:8485/cloud-1</value>
<description>指定cloud-1的兩個NameNode共享edits文件目錄時,使用的是JournalNode集羣來維護</description>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.cloud-1</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cloud-1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
cloud-2
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos95:8485;centos111:8485;centos112:8485/cloud-2</value>
<description>指定cloud-2的兩個NameNode共享edits文件目錄時,使用的是JournalNode集羣來維護</description>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.cloud-2</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cloud-2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
配置:core-site.xml(全部節點)
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cloud-1</value>
<description>此處是默認的HDFS路徑,在節點centos94和centos105中使用cloud-1,在節點centos95和centos112中使用cloud-2</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/admin/hadoop-2.2.0/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>centos95:2181,centos111:2181,centos112:2181</value>
<description>Zookeeper集羣<description>
</property>
</configuration>
vi slaves
centos94
centos95
centos111
centos112
centos105
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
一、啓動Zookeeper
在centos9五、centos1十一、centos112上執行
bin/zkServer.sh start
二、啓動JournalNode
在centos9五、centos1十一、centos112上執行:
sbin/hadoop-daemon.sh start journalnode
三、在ZooKeeper集羣中初始化HA的狀態(僅第一次須要執行)
在centos9五、centos112上執行(namenodes節點上):
bin/hdfs zkfc -formatZK
在建立Federation環境的時候,須要注意保持${CLUSTER_ID}的值,以確保全部NN能共享同一個集羣的存儲資源,具體作法是在格式化第一臺NN以後,取得其${CLUSTER_ID}的值,而後用以下命令格式化其餘NN:
hdfs namenode -format -clusterid ${CLUSTER_ID}
四、在cloud-1的centos94節點上執行格式化(只有在第一次啓動時須要進行格式化):
./hdfs namenode -format -clusterId hadoop(本身指定名稱或者由集羣本身生成)
sbin/hadoop-daemon.sh start namenode
生成的hadoop-cluster這個ID是整個集羣共用的。保證兩個NameService能夠共享全部的DataNodes,不然兩個NameService在format以後,生成的clusterid不一致,DataNode會隨機註冊到不一樣的NameNode上。
對centos105(備用NN)節點同步主NN的元數據信息:
bin/hdfs namenode -bootstrapStandby
啓動備NN:
sbin/hadoop-daemon.sh start namenode
在centos9四、centos105上啓動zkfc:
sbin/hadoop-daemon.sh start zkfc
執行後, hadoop0、hadoop1有一個節點就會變爲active狀態。
五、在cloud-2的centos95節點上執行格式化:
./hdfs namenode -format -clusterId hadoop
sbin/hadoop-daemon.sh start namenode
對centos112(備用NN)節點同步主NN的元數據信息:
bin/hdfs namenode -bootstrapStandby
啓動備NN:
sbin/hadoop-daemon.sh start namenode
在centos9五、centos112上啓動zkfc:
sbin/hadoop-daemon.sh start zkfc
六、啓動全部的datanode
在active namenode節點上執行:sbin/hadoop-daemons.sh start datanode
七、啓動後的效果:
能夠看出四者的Cluster ID是一致的。
在centos94節點上執行:
sbin/start-yarn.sh
在RM和NN所在節點master執行:
中止yarn:
stop-yarn.sh
中止hdfs:
stop-dfs.sh
中止zookeeper:
zkServer.sh stop
問題1:格式化後兩個namespace的CID不一致。
解決辦法:刪除全部的tmp文件和dfs文件,從新格式化啓動。
在每個federation內配置hbase集羣,有幾個federation就有幾個hbase集羣,而hbase集羣之間是平行孤立的。須要把各個federation內hadoop配置文件hdfs-site.xml文件放置在hbase的conf目錄下,而後把hbase.rootdir配置成聯邦前綴。
NN從non-HA轉到HA後,要清空/hbase/splitWAL
在zookeeper node作下面的步驟
1.運行/usr/lib/zookeeper/bin/zkCli.sh
2. ls /hbase/splitWAL,若是存在,運行第三步
3.rmr /hbase/splitWAL
4.重啓HBase
把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下,而後重啓HBase.
1.運行~/zookeeper/bin/zkCli.sh
2. ls /hbase/splitWAL,若是存在,運行第三步
3.rmr /hbase/splitWAL
4.重啓HBase