1. HDFS Federation產(chǎn)生背景在Hadoop 1.0中,HDFS的單NameNode設(shè)計帶來諸多問題,包括單點故障、內(nèi)存受限制約集群擴展性和缺乏隔離機制(不同業(yè)務使用同一個NameNode導致業(yè)務相互影響)等,為了解決這些問題,Hadoop 2.0引入了基于共享存儲的HA解決方案和HDFS Federation,這里重點介紹HDFS Federation。 HDFS Federation是指HDFS集群可同時存在多個NameNode,這些NameNode分別管理一部分數(shù)據(jù),且共享所有DataNode的存儲資源。這種設(shè)計可解決單NameNode存在的以下幾個問題: (1)HDFS集群擴展性。多個NameNode分管一部分目錄,使得一個集群可以擴展到更多節(jié)點,不再像1.0中那樣由于內(nèi)存的限制制約文件存儲數(shù)目。 (2)性能更高效。多個NameNode管理不同的數(shù)據(jù),且同時對外提供服務,將為用戶提供更高的讀寫吞吐率。 (3)良好的隔離性。用戶可根據(jù)需要將不同業(yè)務數(shù)據(jù)交由不同NameNode管理,這樣不同業(yè)務之間影響很小。 需要注意的,HDFS Federation并不能解決單點故障問題,也就是說,每個NameNode都存在在單點故障問題,你需要為每個namenode部署一個backup namenode以應對NameNode掛掉對業(yè)務產(chǎn)生的影響。 2.安裝環(huán)境由于HDFS federation仍然存在單點故障問題,所以我們考慮HA和HDFS federation共同搭建。各個節(jié)點角色分配如下:
軟件版本: hadoop:hadoop-2.2.0.tar.gz(利用源碼自編譯后適用于64位系統(tǒng)) zookeeper:zookeeper-3.4.6.tar.gz
前期具體的安裝環(huán)境準備請參考文檔:《Hadoop、HBase、Hive整合安裝文檔》 下面主要是一些參數(shù)設(shè)置: HA + Federation,所有節(jié)點共同部分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(所有節(jié)點) <configuration> <property> <description>此處是默認的HDFS路徑,在節(jié)點centos94和centos105中使用cloud-1,在節(jié)點centos95和centos112中使用cloud-2</description> </property> <description>Zookeeper集群<description> </property> </configuration> 配置 slavesvi slaves centos94 centos95 centos111 centos112 centos105 配置 mapred-site.xml(所有節(jié)點)<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 配置yarn-site.xml(所有節(jié)點)<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> 啟動:1、啟動Zookeeper 在centos95、centos111、centos112上執(zhí)行 bin/zkServer.sh start 2、啟動JournalNode 在centos95、centos111、centos112上執(zhí)行: sbin/hadoop-daemon.sh start journalnode 3、在ZooKeeper集群中初始化HA的狀態(tài)(僅第一次需要執(zhí)行) 在centos95、centos112上執(zhí)行(namenodes節(jié)點上): bin/hdfs zkfc -formatZK 在創(chuàng)建Federation環(huán)境的時候,需要注意保持${CLUSTER_ID}的值,以確保所有NN能共享同一個集群的存儲資源,具體做法是在格式化第一臺NN之后,取得其${CLUSTER_ID}的值,然后用如下命令格式化其他NN: hdfs namenode -format -clusterid ${CLUSTER_ID} 4、在cloud-1的centos94節(jié)點上執(zhí)行格式化(只有在第一次啟動時需要進行格式化): ./hdfs namenode -format -clusterId hadoop(自己指定名稱或者由集群自己生成) sbin/hadoop-daemon.sh start namenode 生成的hadoop-cluster這個ID是整個集群共用的。保證兩個NameService可以共享所有的DataNodes,否則兩個NameService在format之后,生成的clusterid不一致,DataNode會隨機注冊到不同的NameNode上。 對centos105(備用NN)節(jié)點同步主NN的元數(shù)據(jù)信息: bin/hdfs namenode -bootstrapStandby 啟動備NN: sbin/hadoop-daemon.sh start namenode 在centos94、centos105上啟動zkfc: sbin/hadoop-daemon.sh start zkfc 執(zhí)行后, hadoop0、hadoop1有一個節(jié)點就會變?yōu)閍ctive狀態(tài)。 5、在cloud-2的centos95節(jié)點上執(zhí)行格式化: ./hdfs namenode -format -clusterId hadoop sbin/hadoop-daemon.sh start namenode 對centos112(備用NN)節(jié)點同步主NN的元數(shù)據(jù)信息: bin/hdfs namenode -bootstrapStandby 啟動備NN: sbin/hadoop-daemon.sh start namenode 在centos95、centos112上啟動zkfc: sbin/hadoop-daemon.sh start zkfc 6、啟動所有的datanode 在active namenode節(jié)點上執(zhí)行:sbin/hadoop-daemons.sh start datanode 7、啟動后的效果: 可以看出四者的Cluster ID是一致的。 8、啟動YARN在centos94節(jié)點上執(zhí)行: sbin/start-yarn.sh 9、關(guān)閉集群在RM和NN所在節(jié)點master執(zhí)行: 停止yarn: stop-yarn.sh 停止hdfs: stop-dfs.sh 停止zookeeper: zkServer.sh stop 10、總結(jié)問題1:格式化后兩個namespace的CID不一致。 解決辦法:刪除所有的tmp文件和dfs文件,重新格式化啟動。 11、配置federation和HA后的hadoop集群安裝hbase集群在每一個federation內(nèi)配置hbase集群,有幾個federation就有幾個hbase集群,而hbase集群之間是平行孤立的。需要把各個federation內(nèi)hadoop配置文件hdfs-site.xml文件放置在hbase的conf目錄下,然后把hbase.rootdir配置成聯(lián)邦前綴。 12、問題解決方法NN從non-HA轉(zhuǎn)到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. 13、傳統(tǒng)hadoop模式(主從結(jié)構(gòu))下hmaster啟動失敗處理方式(在不存在數(shù)據(jù)的情況下)1.運行~/zookeeper/bin/zkCli.sh 2. ls /hbase/splitWAL,如果存在,運行第三步 3.rmr /hbase/splitWAL 4.重啟HBase
|
|
來自: 春和秋榮 > 《HA與Federation》