HadoopHA(高可用叢集)
一、介紹:
1、所謂HA(High Available),即高可用(7*24小時不中斷服務)
2、實現高可用的關鍵是消除單點故障,即HDFS的nameNode和YARN的resourceManager,所以HA機制就是HDFS的HA和YARN的HA。
由於一個HDFS叢集由一個NameNode節點和多個DataNode節點組成,一旦NameNode節點宕機,那麼HDFS將不能進行檔案的上傳與下載。
由於一個Yarn叢集由一個ResourceManager節點和多個NodeManager節點組成,一旦ResourceManager節點宕機,那麼YARN叢集將不能進行資源的排程。
3、HDFS-HA工作要點:
(1)、雙nameNode來消除單點故障
(2)、元資料管理方式需要改變
記憶體中各自儲存一份元資料;
Edits日誌只有Active狀態的NameNode節點可以做寫操作;兩個NameNode都可以讀取Edits;
共享的Edits放在一個共享儲存中管理(qjournal和NFS兩個主流實現);
(3)、需要一個狀態管理功能模組
實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,
利用zooKeeper進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain splitnaolie
(4)、必須保證兩個NameNode之間能夠ssh無密碼登入
(5)、隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
4、HDFS-HA故障轉移機制圖解:
5、YARN-HA工作機制圖解:
二、HA叢集配置
1、在完全分散式叢集的基礎下
2、配置zooKeeper叢集
(1)將zooKeeper壓縮包放到 /opt/software/目錄下
(2)解壓Zookeeper安裝包到/opt/module/目錄下
[jinghang@Hadoop03 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(3)重新命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg為zoo.cfg
[jinghang@Hadoop03 conf]$mvzoo_sample.cfgzoo.cfg
(4)配置zoo.cfg檔案
修改儲存節點資料
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加zooKeeper叢集配置
#######################cluster##########################
server.1=Hadoop03:2888:3888
server.2=Hadoop04:2888:3888
server.3=Hadoop05:2888:3888
(5)在/opt/module/zookeeper-3.4.10/這個目錄下建立zkData目錄
[jinghang@Hadoop03 zookeeper-3.4.14]$ mkdir zkData
(6)在/opt/module/zookeeper-3.4.10/zkData目錄下建立一個myid的檔案
[jinghang@Hadoop03 zkData]$ touch myid
(7)編輯myid檔案,在裡面新增伺服器ID,比如新增1
(8)分發配置好的zookeeper到其他機器上,並修改分發過去的伺服器的myid檔案,修改伺服器ID
(9)分別啟動zookeeper
[jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start
[jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start
[jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start
(10)檢視狀態
[jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh status
3、配置HDFS-HA叢集
(1)在/opt/module/目錄下建立一個ha資料夾
(2)將/opt/module/下的hadoop-2.7.2拷貝到/opt/module/ha目錄下
(3)配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(4)配置core-site.xml
1 <configuration> 2 <!-- 把兩個NameNode)的地址組裝成一個叢集mycluster --> 3 <property> 4 <name>fs.defaultFS</name> 5 <value>hdfs://mycluster</value> 6 </property> 7 8 <!-- 指定hadoop執行時產生檔案的儲存目錄 --> 9 <property> 10 <name>hadoop.tmp.dir</name> 11 <value>/opt/ha/hadoop-2.7.2/data/tmp</value> 12 </property> 13 <property> 14 <name>ha.zookeeper.quorum</name> 15 <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> 16 </property> 17 </configuration>core-site.xml
(5)配置hdfs-site.xml
1 <configuration> 2 <!-- 完全分散式叢集名稱 --> 3 <property> 4 <name>dfs.nameservices</name> 5 <value>mycluster</value> 6 </property> 7 8 <!-- 叢集中NameNode節點都有哪些 --> 9 <property> 10 <name>dfs.ha.namenodes.mycluster</name> 11 <value>nn1,nn2</value> 12 </property> 13 14 <!-- nn1的RPC通訊地址 --> 15 <property> 16 <name>dfs.namenode.rpc-address.mycluster.nn1</name> 17 <value>hadoop102:9000</value> 18 </property> 19 20 <!-- nn2的RPC通訊地址 --> 21 <property> 22 <name>dfs.namenode.rpc-address.mycluster.nn2</name> 23 <value>hadoop103:9000</value> 24 </property> 25 26 <!-- nn1的http通訊地址 --> 27 <property> 28 <name>dfs.namenode.http-address.mycluster.nn1</name> 29 <value>hadoop102:50070</value> 30 </property> 31 32 <!-- nn2的http通訊地址 --> 33 <property> 34 <name>dfs.namenode.http-address.mycluster.nn2</name> 35 <value>hadoop103:50070</value> 36 </property> 37 38 <!-- 指定NameNode元資料在JournalNode上的存放位置 --> 39 <property> 40 <name>dfs.namenode.shared.edits.dir</name> 41 <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> 42 </property> 43 44 <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 --> 45 <property> 46 <name>dfs.ha.fencing.methods</name> 47 <value>sshfence</value> 48 </property> 49 50 <!-- 使用隔離機制時需要ssh無祕鑰登入--> 51 <property> 52 <name>dfs.ha.fencing.ssh.private-key-files</name> 53 <value>/home/jinghang/.ssh/id_rsa</value> 54 </property> 55 56 <!-- 宣告journalnode伺服器儲存目錄--> 57 <property> 58 <name>dfs.journalnode.edits.dir</name> 59 <value>/opt/ha/hadoop-2.7.2/data/jn</value> 60 </property> 61 62 <!-- 關閉許可權檢查--> 63 <property> 64 <name>dfs.permissions.enable</name> 65 <value>false</value> 66 </property> 67 68 <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式--> 69 <property> 70 <name>dfs.client.failover.proxy.provider.mycluster</name> 71 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 72 </property> 73 <property> 74 <name>dfs.ha.automatic-failover.enabled</name> 75 <value>true</value> 76 </property> 77 </configuration>hdfs-site.xml
(6)分發到其他伺服器
4、配置YARN-HA叢集
(1)配置yarn-site.xml
1 <configuration> 2 3 <property> 4 <name>yarn.nodemanager.aux-services</name> 5 <value>mapreduce_shuffle</value> 6 </property> 7 8 <!--啟用resourcemanager ha--> 9 <property> 10 <name>yarn.resourcemanager.ha.enabled</name> 11 <value>true</value> 12 </property> 13 14 <!--宣告兩臺resourcemanager的地址--> 15 <property> 16 <name>yarn.resourcemanager.cluster-id</name> 17 <value>cluster-yarn1</value> 18 </property> 19 20 <property> 21 <name>yarn.resourcemanager.ha.rm-ids</name> 22 <value>rm1,rm2</value> 23 </property> 24 25 <property> 26 <name>yarn.resourcemanager.hostname.rm1</name> 27 <value>hadoop102</value> 28 </property> 29 30 <property> 31 <name>yarn.resourcemanager.hostname.rm2</name> 32 <value>hadoop103</value> 33 </property> 34 35 <!--指定zookeeper叢集的地址--> 36 <property> 37 <name>yarn.resourcemanager.zk-address</name> 38 <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> 39 </property> 40 41 <!--啟用自動恢復--> 42 <property> 43 <name>yarn.resourcemanager.recovery.enabled</name> 44 <value>true</value> 45 </property> 46 47 <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> 48 <property> 49 <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> 50 </property> 51 </configuration>yarn-site.xml
(2)分發到其他伺服器
5、啟動
(1)在各個JournalNode節點上,輸入以下命令啟動journalnode服務:
sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,對其進行格式化,並啟動:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步nn1的元資料資訊:
bin/hdfs namenode -bootstrapStandby
(4)啟動[nn2]:
sbin/hadoop-daemon.sh start namenode
(5)啟動所有DataNode
sbin/hadoop-daemons.sh start datanode
(6)再啟動各臺伺服器中的Zookeeper叢集:
bin/zkServer.sh start
(7)在任意伺服器初始化HA在Zookeeper中狀態:
bin/hdfs zkfc -formatZK
(8)在namenode所在的節點啟動HDFS服務:
sbin/start-dfs.sh
(9)在resourcemanager所在的伺服器執行:
sbin/start-yarn.sh
(10)確保兩個resourcemanager都啟動了,如果沒有啟動手動開啟:
sbin/yarn-daemon.sh start resourcemanager
(11)檢視服務狀態,如圖3-24所示
bin/yarn rmadmin -getServiceState rm1
bin/hdfs haadmin -getServiceState nn1