Setting Up Hadoop NameNode High Availability
Hadoop2.0以后,2個NameNode的數(shù)據(jù)其實是實時共享的。新HDFS采用了一種共享機制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)進行共享。NFS是操作系統(tǒng)層面的,JournalNode是hadoop層面的,本文使用JournalNode集群進行數(shù)據(jù)共享(這也是主流的做法)。如下圖所示,便是JournalNode的架構(gòu)圖。
兩個NameNode為了數(shù)據(jù)同步,會通過一組稱作JournalNodes的獨立進程進行相互通信。當active狀態(tài)的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態(tài)的NameNode有能力讀取JNs中的變更信息,并且一直監(jiān)控edit log的變化,把變化應用于自己的命名空間。standby可以確保在集群出錯時,命名空間狀態(tài)已經(jīng)完全同步了。
對于HA集群而言,確保同一時刻只有一個NameNode處于active狀態(tài)是至關(guān)重要的。否則,兩個NameNode的數(shù)據(jù)狀態(tài)就會產(chǎn)生分歧,可能丟失數(shù)據(jù),或者產(chǎn)生錯誤的結(jié)果。為了保證這點,這就需要利用使用ZooKeeper了。首先HDFS集群中的兩個NameNode都在ZooKeeper中注冊,當active狀態(tài)的NameNode出故障時,ZooKeeper能檢測到這種情況,它就會自動把standby狀態(tài)的NameNode切換為active狀態(tài)。
一、NameNode HA搭建
1.1 環(huán)境介紹
本文的環(huán)境如下表所示:
1.2 環(huán)境設置
針對hadoop集群環(huán)境需要設置SSH免密碼登錄以及安裝JDK。在搭建hadoop集群的時候,已經(jīng)設置了,這里直接省略.....
1.3 Zookeeper集群搭建
請參考我的博客鏈接:Configuring Zookeeper Cluster
1.4 編輯core-site.xml,追加以下內(nèi)容
1.5 編輯hdfs-site.xml,追加以下內(nèi)容
<!-- Configure NameNode High Availability. --> <!-- 指定nameservices名稱(這個要和core-site.xml文件中的值相同) --><property><name>dfs.nameservices</name><value>NNcluster</value></property> <!--啟用NameNode故障時自動切換--><property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--NNcluster下面有兩個NameNode,分別是nn1,nn2--><property><name>dfs.ha.namenodes.NNcluster</name><value>nn1,nn2</value></property> <!--nn1對應hdp01--><property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>hdp01:9000</value> </property> <!--nn2對應hdp02--><property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>hdp02:9000</value> </property><property><name>dfs.namenode.rpc-address.NNcluster.nn1</name><value>hdp01:8020</value></property><property><name>dfs.namenode.rpc-address.NNcluster.nn2</name><value>hdp02:8020</value></property><property><name>dfs.namenode.http-address.NNcluster.nn1</name><value>hdp01:50070</value></property><property><name>dfs.namenode.http-address.NNcluster.nn2</name><value>hdp02:50070</value></property> <!--指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置,一般JournalNode為奇數(shù)個,這里配置不合理--><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hdp01:8485;hdp02:8485;hdp03:8485;hdp04:8485/NNcluster</value></property> <!-- 配置失敗自動切換實現(xiàn)方式 --><property><name>dfs.client.failover.proxy.provider.NNcluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property> <!-- 配置隔離機制 --> <property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property> <!-- 使用隔離機制時需要ssh免登陸 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property>如果要啟用NameNode的自動切換特性,必須配置oozie high availability,只需在oozie-env.sh里定義OOZIE_HTTP_HOSTNAME即可。這個名稱對應的IP必須是可漂移的IP。
1.6 同步文件?其他節(jié)點
[hadoop@hdp01 hadoop]$ for i in {2..4};do scp hdfs-site.xml* hdp0$i:/u01/hadoop/etc/hadoop;done [hadoop@hdp01 hadoop]$ for i in {2..4};do scp core-site.xml hdp0$i:/u01/hadoop/etc/hadoop;done二、啟動服務
2.1 啟動JournalNode服務
現(xiàn)在主節(jié)點啟動,然后在其他節(jié)點啟動:
2.2 初始化JournalNodes
分別在各個節(jié)點執(zhí)行以下命令:
如果不想在交互模式下執(zhí)行上述命令,就加-force和-nonInteractive參數(shù)即可。
2.3 初始化ZooKeeper中的HA狀態(tài)
這步只需在Master節(jié)點執(zhí)行即可,如下:
啟動zkfc服務:
[hadoop@hdp01 hadoop]$ hadoop-daemons.sh start zkfcStandby節(jié)點啟動namenode服務:
[hadoop@hdp02 ~]$ hdfs namenode -bootstrapStandby -force2.4 重啟hadoop集群(可選項)
[hadoop@hdp01 ~]$ stop-yarn.sh;stop-dfs.sh [hadoop@hdp01 ~]$ start-dfs.sh;start-yarn.sh2.5 節(jié)點狀態(tài)驗證
[hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn1 active [hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn2 standby三、測試NameNode HA的高可用性
如2.5看到的,nn1狀態(tài)為active,nn2狀態(tài)為standby,停止nn1的namenode服務,看是否可以自動切換,如下:
經(jīng)驗證可以正常使用。開啟nn1的namenode服務,如下:
[hadoop@hdp01 ~]$ hadoop-daemon.sh start namenode starting namenode, logging to /u01/hadoop/logs/hadoop-hadoop-namenode-hdp01.out [hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn1 standby四、應用配置
4.1 Hbase設置
修改hbase-site.xml中的hbase.rootdir,如下:
鏈接hadoop的配置文件?hbase的conf目錄下:
--如果HBase HA模式,主備節(jié)點以及regionservers節(jié)點都要做如下鏈接 [hadoop@hdp01 ~]$ ln -s /u01/hadoop/etc/hadoop/hdfs-site.xml /u01/hbase/conf/hdfs-site.xml [hadoop@hdp01 ~]$ ln -s /u01/hadoop/etc/hadoop/core-site.xml /u01/hbase/conf/core-site.xml如果不做上述鏈接,則在啟動hbase的過程會報錯(雖然啟動成功,但有些操作不能執(zhí)行),而且regionservers也會啟動失敗。報錯信息如下:
[hadoop@hdp01 conf]$ hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr 6 19:36:54 PDT 2017hbase(main):001:0> statusERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializingat org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)at org.apache.hadoop.hbase.master.MasterRpcServices.getClusterStatus(MasterRpcServices.java:792)at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:58519)at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2339)at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:123)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:188)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:168)正常的執(zhí)行結(jié)果如下:
hbase(main):001:0> status 1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load4.2 Hive設置
編輯hive-site.xml文件,修改如下內(nèi)容:
Hive的元數(shù)據(jù)庫修改:
主要修改兩張表:DBS和SDS。
其中DBS里定義了數(shù)據(jù)庫的位置信息,如下圖:
而SDS定義了表的位置信息:
如果以上兩張表不做修改,則在對表進行操作的時候,會報如下錯誤:
修改后的結(jié)果如下:
查詢驗證:
轉(zhuǎn)載于:https://blog.51cto.com/candon123/2057016
總結(jié)
以上是生活随笔為你收集整理的Setting Up Hadoop NameNode High Availability的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LNMP架构介绍
- 下一篇: Refuses to install f