本篇主要從hdfs的namenode和resourcemanager的高可用進行安裝和原理的闡述。html
1、HA安裝java
一、基本環境準備node
1.1.一、centos7虛擬機安裝,詳情見VMware安裝Centos7虛擬機linux
1.1.二、關閉防火牆web
systemctl stop firewalld.service
systemctl disable firewalld.service
1.1.三、修改selinuxsql
vim /etc/selinux/config
將SELINUX=enforcing改成SELINUX=disabledshell
[hadoop@lgh2 ~]$ cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
1.1.四、安裝javaapache
java 安裝 tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/ vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_201 export JRE_HOME=/usr/local/jdk1.8.0_201/jre export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
1.1.五、添加用戶hadoopbootstrap
groupadd hadoop useradd -g hadoop -d /home/hadoop echo 'hadoop' | passwd hadoop --stdin
1.1.六、修改/etc/hostsvim
cat /etc/hosts 192.168.88.131 lgh1 192.168.88.132 lgh2 192.168.88.133 lgh3
如上環境咱們準備三臺機器,如上1.1.6所見:
1.1.七、配置免密登陸
ssh-keygen -t rsa #這個操做須要連續三次按enter鍵, ssh-copy-id lgh3 ssh-copy-id lgh2 ssh-copy-id lgh1
1.1.八、配置時間同步(這個很重要,在生產環境一定要有,不過本身玩也能夠不用配置)
首先咱們選定192.168.88.131(lgh1)這臺爲時間標準的節點,其餘兩臺機器同這個節點進行同步
設置192.168.88.131這個節點:
yum install -y ntp #若是沒有安裝就安裝 [root@lgh1 ~]# rpm -qa | grep ntp #查看安裝結果 ntp-4.2.6p5-29.el7.centos.x86_64 #用來提供時間同步服務 ntpdate-4.2.6p5-29.el7.centos.x86_64 #和某臺服務器進行同步
修改/etc/ntp.conf文件
egrep -v "^$|#" /etc/ntp.conf [root@lgh1 ~]# egrep -v "^$|#" /etc/ntp.conf driftfile /var/lib/ntp/drift restrict default nomodify notrap nopeer noquery restrict 192.168.88.0 mask 255.255.255.0 nomodify notrap restrict 127.0.0.1 restrict ::1 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst server 127.127.1.0 fudge 127.127.1.0 stratum 10 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys disable monitor
systemctl enable ntpd #啓動
其餘兩個節點:lhg2和lgh3設置以下:
首先要安裝ntpd:yum install -y ntp #若是沒有安裝則要安裝
新增crontab -e
*/5 * * * * /usr/sbin/ntpdate -u 192.168.88.131 #表示每五分鐘和131時間同步一次
測試:(能夠經過以下命令修改131的時間,看其餘兩個節點是否能同步成功,親測成功)
date "+%Y-%m-%d %H:%M:%S"
date -s '2018-09-20 10:02:02'
二、hadoop高可用安裝
1.2.一、安裝規劃--目錄
mkdir -p /opt/hadoop #存放hadoop文件,安裝目錄 chown -R hadoop:hadoop /opt/hadoop mkdir -p /opt/data/hadoop/hdfs #存放namenode和datanode的數據 mkdir -p /opt/data/hadoop/tmp #存放臨時文件 chown -R hadoop:hadoop /opt/data/hadoop/hdfs chown -R hadoop:hadoop /opt/data/hadoop/tmp
1.2.二、角色規劃
解壓1.2.三、zookeeper安裝
cd /opt/hadoop tar -zxvf zookeeper-3.4.8.tar.gz ln -s zookeeper-3.4.8 zookeeper
配置環境變量
vim /etc/profile export ZOOKEEPER_HOME=/opt/hadoop/zookeeper export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH source /etc/profile
修改配置zoo.cfg
cd /opt/hadoop/zookeeper/conf cp zoo_sample.cfg zoo.cfg vim zoo.cfg tickTime=2000 #服務器與客戶端之間交互的基本時間單元(ms) initLimit=10 # 此配置表示容許follower鏈接並同步到leader的初始化時間,它以tickTime的倍數來表示。當超過設置倍數的tickTime時間,則鏈接失敗 syncLimit=5 # Leader服務器與follower服務器之間信息同步容許的最大時間間隔,若是超過次間隔,默認follower服務器與leader服務器之間斷開連接 dataDir=/opt/hadoop/zookeeper/data #保存zookeeper數據路徑 dataLogDir=/opt/hadoop/zookeeper/dataLog #保存zookeeper日誌路徑,當此配置不存在時默認路徑與dataDir一致 clientPort=2181 #客戶端訪問zookeeper時通過服務器端時的端口號 server.1=lgh1:2888:3888 #表示了不一樣的zookeeper服務器的自身標識,做爲集羣的一部分,每一臺服務器應該知道其餘服務器的信息 server.2=lgh2:2888:3888 server.3=lgh3:2888:3888 maxClientCnxns=60 #限制鏈接到zookeeper服務器客戶端的數量
修改myid文件
cd /opt/hadoop/zookeeper mkdir data dataLog cd /opt/hadoop/zookeeper/data touch myid && echo 1 > myid
分發並修改myid文件
scp -r /opt/hadoop/zookeeper hadoop@lgh2:/opt/hadoop/
scp -r /opt/hadoop/zookeeper hadoop@lgh3:/opt/hadoop/
vim /opt/hadoop/zookeeper/data/myid #lgh2 修改成2
vim /opt/hadoop/zookeeper/data/myid #lgh3 修改成3
啓動並查看狀態
zkServer.sh start
zkServer.sh status
一臺爲leader狀態,其餘兩個爲follower狀態
1.2.四、解壓hadoop
cd /opt/hadoop tar -zxvf hadoop-2.7.7.tar.gz ln -s hadoop-2.7.7 hadoop
1.2.五、配置環境變量
export HADOOP_HOME="/opt/hadoop/hadoop-2.7.7"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
1.2.六、修改hadoop-env.sh、mapred-env.sh、yarn-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_201
1.2.七、修改hdfs-site.xml文件
<configuration> <property> <!-- 爲namenode集羣定義一個services name --> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <!-- nameservice 包含哪些namenode,爲各個namenode起名 --> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <!-- 名爲nn1的namenode 的rpc地址和端口號,rpc用來和datanode通信 --> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>lgh1:8020</value> </property> <property> <!-- 名爲nn2的namenode 的rpc地址和端口號,rpc用來和datanode通信 --> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>lgh2:8020</value> </property> <property> <!--名爲nn1的namenode 的http地址和端口號,web客戶端 --> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>lgh1:50070</value> </property> <property> <!--名爲nn2的namenode 的http地址和端口號,web客戶端 --> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>lgh2:50070</value> </property> <property> <!-- namenode間用於共享編輯日誌的journal節點列表 --> <!-- 指定NameNode的edits元數據的共享存儲位置。也就是JournalNode列表 該url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId journalId推薦使用nameservice,默認端口號是:8485 --> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://lgh1:8485;lgh2:8485;lgh3:8485/mycluster</value> </property> <property> <!-- journalnode 上用於存放edits日誌的目錄 --> <name>dfs.journalnode.edits.dir</name> <value>/opt/hadoop/hadoop/tmp/data/dfs/jn</value> </property> <property> <!-- 客戶端鏈接可用狀態的NameNode所用的代理類 --> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <!-- 配置隔離機制方法,多個機制用換行分割,即每一個機制暫用一行 --> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔離機制時須要ssh免登錄 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- journalnode集羣之間通訊的超時時間 --> <property> <name>dfs.qjournal.start-segment.timeout.ms</name> <value>60000</value> </property> <!-- 指定副本數 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!--namenode路徑--> <property> <name>dfs.namenode.name.dir</name> <value>/opt/data/hadoop/hdfs/nn</value> </property> <!--datanode路徑--> <property> <name>dfs.datanode.data.dir</name> <value>/opt/data/hadoop/hdfs/dn</value> </property> <!-- 開啓NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 啓用webhdfs --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> </configuration>
1.2.八、修改core-site.xml
<configuration> <property> <!-- hdfs 地址,ha中是鏈接到nameservice --> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <!-- --> <name>hadoop.tmp.dir</name> <value>/opt/data/hadoop/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>lgh1:2181,lgh2:2181,lgh3:2181</value> </property> <!-- hadoop連接zookeeper的超時時長設置 --> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>30000</value> <description>ms</description> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>hadoop.proxyuser.hdfs.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hdfs.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hive.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hive.hosts</name> <value>*</value> </property> </configuration>
1.2.九、修改yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>106800</value> </property> <property> <!-- 啓用resourcemanager的ha功能 --> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <!-- 爲resourcemanage ha 集羣起個id --> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-cluster</value> </property> <property> <!-- 指定resourcemanger ha 有哪些節點名 --> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <!-- 指定第一個節點的所在機器 --> <name>yarn.resourcemanager.hostname.rm1</name> <value>lgh2</value> </property> <property> <!-- 指定第二個節點所在機器 --> <name>yarn.resourcemanager.hostname.rm2</name> <value>lgh3</value> </property> <property> <!-- 指定resourcemanger ha 所用的zookeeper 節點 --> <name>yarn.resourcemanager.zk-address</name> <value>lgh1:2181,lgh2:2181,lgh3:2181</value> </property> <property> <!-- --> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 制定resourcemanager的狀態信息存儲在zookeeper集羣上 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.log.server.url</name> <value>http://lgh2:19888/jobhistory/logs/</value> </property> </configuration>
1.2.十、修改 slaves
lgh1
lgh2
lgh3
1.2.十一、分發到其餘兩個節點
scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh2:/opt/hadoop/
scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh3:/opt/hadoop/
1.2.十二、格式化nomenode和zookeeper
[hadoop@lgh1 ~]$ hdfs namenode -format
[hadoop@lgh2 ~]$ hdfs namenode -bootstrapStandby
[hadoop@lgh1 ~]$ hdfs zkfc -formatZK #格式化zookeeper
1.2.1三、啓動
stop-dfs.sh #關閉全部journalnode start-dfs.sh #啓動namenode,datanode,journalnode等組件 start-yarn.sh #啓動yarn [hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager #這裏必定要注意是yarn-daemon.sh,啓動resourcemanager [hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager
1.2.1四、查看進程
jps (圖片不協調。。。)
1.2.1五、 訪問頁面(namenode)
192.168.88.131:50070
192.168.88.132:50070
1.2.1六、測試namenode故障轉移
在節點192.168.88.132上執行:
[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh stop namenode
而後咱們恢復192.168.88.132的namenode
[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh start namenode
該節點變成了standby節點。說明故障轉移成功
1.2.1七、查看yarn頁面訪問
resourcemanager的故障測試:
[hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh stop resourcemanager #停掉lgh3節點上的resourcemanager
這裏不截圖了,很成功
到這裏hadoop的高可用就安裝完畢了(不過筆者這個中踩了很多坑,遇到一些奇葩問題,可是沒有記錄,總之,刪除掉生成的東西,多格式化幾回試試)
刪除的目錄有:
rm -rf /opt/data/hadoop/hdfs/*
rm -rf /opt/data/hadoop/tmp/*
rm -rf /opt/hadoop/hadoop/logs/*
2、基本原理
一、namenode高可用
咱們知道namenode是整個hdfs的核心,若是namenode掛了,那麼整個hdfs文件系統也不能提供服務,因此hadoop對hdfs提供了高可用的方案,即Hadoop HA,hdfs的高可用提供了兩種方案,一種是基於QJM(Quorum Journal Manager)的,一種是基於NFS的,咱們用的通常都是基於QJM的,因此這裏也是講基於QJM的高可用,高可用用來解決NameNode單點故障的問題。解決的方法是在HDFS集羣中設置多個NameNode節點。那麼提供多個namenode一定存在新的問題:
一、如何保證NameNode內存中元數據數據一致,並保證編輯日誌文件的安全性。
二、多個NameNode如何協做
三、客戶端如何能正確地訪問到可用的那個NameNode。
四、怎麼保證任意時刻只能有一個NameNode處於對外服務狀態
針對如上問題,hadoop提供了以下解決方案:
對於保證NameNode元數據的一致性和編輯日誌的安全性,採用Zookeeper來存儲編輯日誌文件。
兩個NameNode一個是Active狀態的,一個是Standby狀態的,一個時間點只能有一個Active狀態的 。
NameNode提供服務,兩個NameNode上存儲的元數據是實時同步的,當Active的NameNode出現問題時,經過Zookeeper實時切換到Standby的NameNode上,並將Standby改成Active狀態。
客戶端經過鏈接一個Zookeeper的代理來肯定當時哪一個NameNode處於服務狀態。
咱們看一下hdfs高可用的架構圖:以下圖所示:
HDFS HA架構中有兩臺NameNode節點,一臺是處於活動狀態(Active)爲客戶端提供服務,另一臺處於熱備份狀態(Standby)。
DataNode會將心跳信息和Block彙報信息同時發給兩臺NameNode,DataNode只接受Active NameNode發來的文件讀寫操做指令。爲了使備用節點保持其狀態與Active節點同步,兩個節點都與一組稱爲「JournalNodes」(JN)的單獨守護進程通訊。當Active節點執行任何名稱空間修改時,它會將修改記錄持久地記錄到大多數這些JN中。待機節點可以從JN讀取編輯,而且不斷觀察它們對編輯日誌的更改。當備用節點看到編輯時,它會將它們應用到本身的命名空間。若是發生故障轉移,Standby將確保在將自身升級爲Active狀態以前已從JournalNodes讀取全部編輯內容。這可確保在發生故障轉移以前徹底同步命名空間狀態。注意:必須至少有3個JournalNode守護進程,由於編輯日誌修改必須寫入大多數JN。這將容許系統容忍單個機器的故障。您也能夠運行3個以上的JournalNodes,但爲了實際增長系統能夠容忍的失敗次數,您應該運行奇數個JN(即3,5,7等)。請注意:當使用N JournalNodes運行時,系統最多能夠容忍(N-1)/ 2個故障並繼續正常運行。
Zookeeper來保證在Active NameNode失效時及時將Standby NameNode修改成Active狀態。
故障檢測 - 集羣中的每一個NameNode計算機都在ZooKeeper中維護一個持久會話。若是計算機崩潰,ZooKeeper會話將過時,通知其餘NameNode應該觸發故障轉移。Active NameNode選舉 - ZooKeeper提供了一種簡單的機制,能夠將節點專門選爲活動節點。若是當前活動的NameNode崩潰,則另外一個節點可能在ZooKeeper中採用特殊的獨佔鎖,指示它應該成爲下一個活動的。
ZKFailoverController(ZKFC)是一個新組件,它是一個ZooKeeper客戶端,它還監視和管理NameNode的狀態。運行NameNode的每臺機器也運行ZKFC,ZKFC負責:
一、運行情況監視 : ZKFC按期使用運行情況檢查命令對其本地NameNode進行ping操做。只要NameNode及時響應健康狀態,ZKFC就認爲該節點是健康的。若是節點已崩潰,凍結或以其餘方式進入不健康狀態,則運行情況監視器會將其標記爲運行情況不佳。
二、ZooKeeper會話管理 :當本地NameNode運行正常時,ZKFC在ZooKeeper中保持會話打開。若是本地NameNode處於活動狀態,它還擁有一個特殊的「鎖定」znode。此鎖使用ZooKeeper對「短暫」節點的支持; 若是會話過時,將自動刪除鎖定節點
三、基於ZooKeeper的選舉 :若是本地NameNode是健康的,而且ZKFC發現沒有其餘節點當前持有鎖znode,它將本身嘗試獲取鎖。若是成功,那麼它「贏得了選舉」,並負責運行故障轉移以使其本地NameNode處於活動狀態。故障轉移過程相似於上述手動故障轉移:首先,必要時對先前的活動進行隔離,而後本地NameNode轉換爲活動狀態。
元數據文件有兩個文件:fsimage和edits,備份元數據就是備份這兩個文件。JournalNode用來實時從Active NameNode上拷貝edits文件,JournalNode有三臺也是爲了實現高可用。
Standby NameNode不對外提供元數據的訪問,它從Active NameNode上拷貝fsimage文件,從JournalNode上拷貝edits文件,而後負責合併fsimage和edits文件,至關於SecondaryNameNode的做用。最終目的是保證Standby NameNode上的元數據信息和Active NameNode上的元數據信息一致,以實現熱備份。
二、resourcemanager高可用
首先咱們來看一下官方提供的架構圖:如圖所示:
ResourceManager HA經過主動/備用架構實現 - 在任什麼時候間點,其中一個RM處於活動狀態,而且一個或多個RM處於待機模式,等待活動RM出現故障或者宕機時機。轉換爲活動的觸發器來自管理員(經過CLI)或啓用自動故障轉移時的集成故障轉移控制器。
RM能夠選擇嵌入基於Zookeeper的ActiveStandbyElector來決定哪一個RM應該是Active。當Active關閉或無響應時,另外一個RM自動被選爲Active,而後接管。請注意,不須要像HDFS那樣運行單獨的ZKFC守護程序,由於嵌入在RM中的ActiveStandbyElector充當故障檢測器和領導者選擇器而不是單獨的ZKFC守護程序。
當存在多個RM時,客戶端和節點使用的配置(yarn-site.xml)應該列出全部RM。客戶端,應用程序管理器ApplicationMaster(AM)和節點管理器NodeManager(NM)嘗試以循環方式鏈接到RM,直到它們到達活動RM。若是活動中止,他們將恢復循環輪詢,直到他們鏈接到新的RM
更多相關文章:hadoop生態系列
參考:
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html