1. 程式人生 > >Hadoop叢集的高可用-HA

Hadoop叢集的高可用-HA

HDFS的高可用:

需求:

我們之前搭建的hadoop叢集是一個NameNode和三個DateNode
原先那套機制:
在這裡插入圖片描述

FSNameSystem 元資料對記憶體的管理器,裡面管理的資料都在記憶體裡面,但是在記憶體裡面的資料不太可靠,所以有一個 fsimage 做持久化操作,更新的操作是在edits裡面,當一個客戶端做資料的操作的時候,導致元資料要發生變化,先把操作記錄在日誌裡面,如果操作成功了,就再記錄在記憶體裡面。這些 edits裡面的操作記錄的資料跟fsimage裡面的資料沒有合併,fsimage裡面的資料要比記憶體裡面的資料落後一大截。這個時候SecondaryNameNode

就出場了,它隔一段時間,就把edits檔案下載下來,進行合併 – 把他們都載入到記憶體形成一份新的元資料。然後再把記憶體中的資料進行持久化到一個檔案 – (更新的fsimage),然後會將這份新的fsimage傳送到NameNode這一邊。把NameNode這邊舊的fsimage替換掉。

但是我們發現一個問題

一旦NameNode機器宕機了,那麼hdfs系統無法再提供服務了。可用性比較低。
可用性 – 7*24h – 365d
之前我們多web程式使用的是keepalived來實現高可用,但是放在這裡是不行的,web服務是需要用來提供訪問就可以。但是hadoop機器會實時產生新的檔案到hdfs檔案系統裡面。
keepalived本省對業務程式是沒有任何的侵入的,就是去配置機器的ip。keepalived會維護一個虛擬的ip地址,對外提供一個統一的ip。
在hadoop叢集裡面不是簡單地切換ip就可以了。

解決辦法:

我們要至少有兩個NameDode,並且有狀態標識,Active:正在提供服務的,StandBy-候補。
由於要對提供服務,那麼一定會涉及到資料的同步問題。
資料要進行同步,比較棘手,元資料是比較大的,記憶體裡面可能會有好幾個g。
凡是涉及到分散式裡面的麻煩事裡面,就搞一個第三方出來。
我們把edits檔案都拿出來,放在第三方。
Active只要操作了,就往第三方的edits檔案中記錄,StandBy也從第三方中拿edits檔案,在本地進行合併成新的元資料。
這樣ActiveStandBy相差的資料就不會太大

第三方得必須非常可靠,第三方掛了之後,我們應該保證還能正常工作,只是Active跟StandBy之間的資料同步就無法進行了。

第三方也是一個叢集

qjournal : 分散式系統

這個第三方叢集要利用zookeeper實現分散式系統
在這裡插入圖片描述

這個HA叢集要保持一致性,可靠性,需要有一個第三方來協調,這個第三方就是zookeeper。所以這個系統要部署,就必須要有一個zookeeper叢集。

在這裡插入圖片描述

NameNode本地為了保險起見,還是需要再存一份edits檔案的。edits檔案比較小。

每一臺NameNode上面都有一個程式 ZKFX
ZKFC : zookeeper fail control 失敗切換的。

ZKFC可以通過rpc介面去呼叫NameNode – 能夠更加精確地知道NameNode的工作狀態。

ZKFC通過zookeeper上的節點來實現動態感知。

在這裡插入圖片描述

ZKFC在切換狀態之前,需要先殺死一個NameNode,防止出現腦裂現象。

在這裡插入圖片描述

這兩個NameNode會有一個邏輯名稱,這樣對外提供服務,只需要設定這個邏輯名稱就可以了。

HA機制是不需要SecondaryNameNode的,因為StandBy這臺機器在閒置的時候,是可以充當SecondaryNameNode的作用的。 – checkPoint

YARN的高可用:

yarn的高可用並那不是那麼迫切。
但是也可以實現,有兩個ResourceManager,也是通過zookeeper去動態感知。


分散式系統肯定是可以讓所有的都不放在一起的,但是有的情況下,放在一起會好一點,比如說NodeManager和DatanNode放在一起就比較合理。其他情況,只要有機器就分開,機器不夠才放在一起。

機器分佈:

ha1		namenode	zkfc
ha2		namenode	zkfc
ha3		resourcemanager
ha4		resourcemanager
ha5		nodemanager	datanode	zookeeper		journalnode
ha6		nodemanager	datanode	zookeeper		journalnode
ha7		nodemanager	datanode	zookeeper		journalnode

journalnode : 寫edits日誌的叢集

如果是三臺機器的話:

ha1		namenode  zkfc	resoursemanager  nodemanager  datanode  zookeeper		journalnode
ha2		namenode  zkfc	resoursemanager	nodemanager datanode  zookeeper		journalnode
ha3										nodemanager  datanode  zookeeper		journalnode

步驟:
首先先從之前的hadoop叢集中挑選一個複製,最好是很純淨版本的,這樣機器壓力會小一點。
比如我複製的就是之前的bd2這個機器,克隆好之後(我使用的是完整克隆)我也不太清楚完整克隆還是連結克隆更加適合。
複製好之後我就先修改了hostname:

/etc/sysconfig/network

把hostname改成ha1,
然後修改host檔案

/etc/hosts

裡面設定成:

192.168.17.161 ha1
192.168.17.162 ha2
192.168.17.163 ha3
192.168.17.164 ha4
192.168.17.165 ha5
192.168.17.166 ha6
192.168.17.167 ha7

由於我是克隆的,所以還需要修改網絡卡
參考文章:
https://blog.csdn.net/zuixiaoyao_001/article/details/80641665
我直接把原先的eth0刪除,然後把eth1改成eth0。
接著就是配置ip了

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes #是否開機啟用
BOOTPROTO=static #ip地址設定為靜態
IPADDR=192.168.17.161
NETMASK=255.255.255.0

如果這裡面有mac地址,就應該修改成eth0的mac地址

然後就reboot重啟。這樣ip就設定好了。
這樣一臺ha1裡面已經有jdk,安裝了hadoop,還有hadoop這個使用者都配置好了。
注意你需要檢查一下有沒有免密登入。
沒有的話需要設定

然後就把這臺ha1複製6份。

在這裡插入圖片描述

要配置免密登入,之前克隆過來的時候配置了,但是克隆過來之後是失效了,所以全部都刪除

rm -rf ~/.ssh

在這裡插入圖片描述

重新生成免密登入的祕鑰,全部發送
在這裡插入圖片描述

然後使用

ssh-copy-id ha1
ssh-copy-id ha2
ssh-copy-id ha3
ssh-copy-id ha4
ssh-copy-id ha5
ssh-copy-id ha6
ssh-copy-id ha7

我只在ha1和ha2上進行了免密登入的設定

在ha5上上傳zookeeper.
在這裡插入圖片描述

為了複製快速點,我們把zookeeper裡面的我們不需要用的檔案刪除。

rm -rf *.xml *.txt docs src *.asc *.md5 *.sha1

在這裡插入圖片描述

dist-maven 這個資料夾也可以刪除。

修改配置檔案
將zoo-template.cfg改成zoo.cfg

vi zoo.cfg

在這裡插入圖片描述

修改 : 
dataDir=/home/hadoop/zkdata
在配置檔案最後增加:
server.1=ha5:2888:3888
server.2=ha6:2888:3888
server.3=ha7:2888:3888

建立目錄

mkdir /home/hadoop/zkdata

進入 zkdata這個目錄
在這裡插入圖片描述
然後往這個目錄寫上myid
在這裡插入圖片描述

將配置好了的zookeeper複製到ha6,ha7上

scp -r apps/zookeeper-3.4.5/ ha5://home/hadoop/apps/

在這裡插入圖片描述

將zkdata複製到ha6,ha7

scp -r zkdata/ ha6:$PWD

在這裡插入圖片描述

然後分別在ha6跟ha7上修改myid。

echo 2 > myid    --  ha6
echo 3 > myid    --  ha7

現在我們先啟動一下zookeeper,看一下能否正常啟動

bin/zkServer.sh start

三臺機器都需要啟動zookeeper

使用jps檢視一下程序:
在這裡插入圖片描述
出現了 QuorumPeerMain

ha5,ha6,ha7每臺機器都去檢視,如果都出現這個程序,那麼zookeeper機器能夠正常啟動。

到現在zookeeper叢集就搞定了

現在就要安裝Hadoop叢集了

把原先的hadoop檔案都刪除 每臺機器上的hadoop都刪除。

我們現在ha1上配置hadoop,然後再複製到其他的機器上去。

在這裡插入圖片描述

刪除一些不需要用的檔案,複製的時候,更快。
還可以刪除 share裡面的doc 檔案

接下來就是修改hadoop的配置檔案了

hadoop-env.sh

  • 配置JAVA_HOME : 因為是使用ssh啟動,是在子程序中啟動 $JAVE_HOME直接獲取不到,所以需要手動指定。

core-site.xml

  • 1.指定hdfs的nameservice,就是NameNode的邏輯名稱
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns/</value>
</property>
  • 2.指定hadoop的臨時目錄
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/apps/hdpdata/</value>
</property>
  • 3.指定zookeeper的地址
<property>
<name>ha.zookeeper.quorum</name>
<value>ha5:2181,ha6:2181,ha7:2181</value>
</property>
</configuration>

hdfs-site.xml

  • 1.指定hdfs的nameservice為ns,需要和core-site.xml中保持yic一致
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
  • 2.ns下有兩個NameNode,分別是nn1,nn2
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
  • 3.兩個NameNode的http和RPC通訊地址
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>ha1:9000</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>ha1:50070</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>ha2:9000</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>ha2:50070</value>
</property>
  • 4.指定NameNode的edits元資料在JournalNode上的存放位置
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha5:8485;ha6:8485;ha7:8485/ns</value>
</property>
  • 5.指定JournalNode在本地磁碟存放資料的位置
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journaldata</value>
</property>
  • 6.開啟NameNode失敗自動切換
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
  • 7.配置失敗自動切換實現方式
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
  • 8.配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property
  • 9.使用sshfence隔離機制時需要ssh免登陸
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
  • 10.配置sshfence隔離機制超時時間
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

將mapred-site.xml.template改名為mapred-site.xml,並且修改

<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

yarn-site.xml – yarn的高可用

<!-- 開啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>ha3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>ha4</value>
</property>
<!-- 指定zk叢集地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>ha5:2181,ha6:2181,ha7:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

配置slaves檔案 – 就是制定DataNode

slaves是指子節點的位置,因為要在ha1上啟動HDFS,在ha3上啟動yarn,所以ha1上的slaves檔案指定的是datanode的位置,ha3上的slaves檔案指定的是NodeManager的位置
vi slaves
在這裡插入圖片描述


到此為止,hadoop的配置就完成了,接下來的就是將配置好了的hadoop分發到其他的機器上。

注意:嚴格按照下面的步驟!!!

1. 啟動zookeeper叢集(分別在ha5、ha6、ha7上啟動zk)
cd /hadoop/zookeeper-3.4.5/bin/
./zkServer.sh start
#檢視狀態:一個leader,兩個follower
./zkServer.sh status

2.啟動journalnode(分別在在ha5、ha6、ha7上執行)

cd /hadoop/hadoop-2.6.4
sbin/hadoop-daemon.sh start journalnode
#執行jps命令檢驗,hadoop05、hadoop06、hadoop07上多了JournalNode程序

在這裡插入圖片描述

3.接下來就是格式化NameNode,只要格式化一個,因為兩個NameNode的元資料要完全嚴格一致。cluster-id,pool都得一樣,所以只能格式化一臺,然後複製給另一臺。

格式化只能在ha1或者ha2其中的一臺上進行

在這裡插入圖片描述

格式化成功之後,檢視:

在這裡插入圖片描述

可以進入目錄裡面檢視一下這個VERSION檔案:
在這裡插入圖片描述

將ha1格式化之後生成的hdpdata複製到ha2相應的資料夾裡。

scp -r hdpdata/ ha2:~/apps/

在這裡插入圖片描述

這樣兩個NameNode的初識資料都是一樣的。

然後還需要格式化ZKFC
在ha1上,格式化一次就可以,因為是往zookeeper上寫。

hdfs zkfc -formatZK

在這裡插入圖片描述

bin/zkCli.sh

檢視zookeeper上的節點

在這裡插入圖片描述

在mini1上啟動,mini1到所有機器的免密登入都要配置

在這裡插入圖片描述

在這裡插入圖片描述

start-dfs會啟動ha1跟ha2上面的NameNode,以及ha5,ha6,ha7上面的DataNode,還有ha5,ha6,ha7上面的journalnode – 寫edits檔案的。還會啟動ha1跟ha2上的兩個太監 – zkfc

啟動yarn,yarn是在ha3獲取ha4上的,所以ha3跟ha4到其他機器的免密登入都要配置好
在這裡插入圖片描述

在ha3上啟動yarn,就會啟動自己(ha3)上的resourcemanager,然後還會啟動ha5,ha6,ha7上的NodeManager

在ha4上還需要手動啟動一個ResourceManager:

在這裡插入圖片描述

ResourceManager 的啟動指令碼不是使用ssh,而是直接在本地啟動的。所以必須放在ha3,ha4上啟動

在這裡插入圖片描述

在這裡插入圖片描述

如果你訪問yarn叢集:
在這裡插入圖片描述

只有ha3會提供這個訪問頁面。訪問ha4的頁面會直接跳轉到ha3的yarn叢集的頁面。


在ha1上關閉hdfs – 就是關閉ha1跟ha2上的NameNode,還會關閉ha5,ha6,ha7上的DataNode
在這裡插入圖片描述

在ha3上關閉yarn
在這裡插入圖片描述

ha4上之前是手動啟動resourceManager的,所以現在也需要手動關閉
在這裡插入圖片描述

最後再關閉zookeeper 叢集


測試HA機制

先像hdfs檔案上上傳一個檔案

hadoop fs -put /etc/profile /

在這裡插入圖片描述

上傳的這個檔案會在ha5,ha6,ha7上都有副本。
ha5,ha6,ha7上的hdpdata目錄的結構:
在這裡插入圖片描述

在ha1 – active上的hdpdata:
在這裡插入圖片描述

在ha2 – standby 上的hdpdata:
在這裡插入圖片描述

然後我把ha1的NameNode服務殺死。

在這裡插入圖片描述

active狀態立即切換過來了。
在這裡插入圖片描述

在這裡插入圖片描述

然後我又往hdfs上上傳了檔案:
在這裡插入圖片描述

接著我又關閉了ha2上的NameNode,啟動了ha1上的NameNode,發現無論哪個NameNode宕機了,都能正常操作hdfs。

ha2上的hdpdata:
在這裡插入圖片描述

ha1上的hdpdata:
在這裡插入圖片描述

這些edits檔案都是交替這遞增的。

如果正在對hdfs檔案正在操作的過程中 active 的 NamenNode突然宕機了。那麼這次hdfs操作可能會失敗


hadoop2.0已經發布了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.6.4又增加了YARN HA

注意:apache提供的hadoop-2.6.4的安裝包是在32位作業系統編譯的,因為hadoop依賴一些C++的本地庫,
所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64作業系統上重新編譯
(建議第一次安裝用32位的系統,我將編譯好的64位的也上傳到群共享裡了,如果有興趣的可以自己編譯一下)

前期準備就不詳細說了,課堂上都介紹了
1.修改Linux主機名
2.修改IP
3.修改主機名和IP的對映關係 /etc/hosts
	######注意######如果你們公司是租用的伺服器或是使用的雲主機(如華為用主機、阿里雲主機等)
	/etc/hosts裡面要配置的是內網IP地址和主機名的對映關係	
4.關閉防火牆
5.ssh免登陸
6.安裝JDK,配置環境變數等

叢集規劃:
	主機名		IP				安裝的軟體					執行的程序
	mini1	192.168.1.200	jdk、hadoop					NameNode、DFSZKFailoverController(zkfc)
	mini2	192.168.1.201	jdk、hadoop					NameNode、DFSZKFailoverController(zkfc)
	mini3	192.168.1.202	jdk、hadoop					ResourceManager 
	mini4	192.168.1.203	jdk、hadoop					ResourceManager
	mini5	192.168.1.205	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
	mini6	192.168.1.206	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
	mini7	192.168.1.207	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
	
說明:
	1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
	hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元資料資訊,一條資料只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode
	這裡還配置了一個zookeeper叢集,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態
	2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
安裝步驟:
	1.安裝配置zooekeeper叢集(在hadoop05上)
		1.1解壓
			tar -zxvf zookeeper-3.4.5.tar.gz -C /home/hadoop/app/
		1.2修改配置
			cd /home/hadoop/app/zookeeper-3.4.5/conf/
			cp zoo_sample.cfg zoo.cfg
			vim zoo.cfg
			修改:dataDir=/home/hadoop/app/zookeeper-3.4.5/tmp
			在最後新增:
			server.1=hadoop05:2888:3888
			server.2=hadoop06:2888:3888
			server.3=hadoop07:2888:3888
			儲存退出
			然後建立一個tmp資料夾
			mkdir /home/hadoop/app/zookeeper-3.4.5/tmp
			echo 1 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
		1.3將配置好的zookeeper拷貝到其他節點(首先分別在hadoop06、hadoop07根目錄下建立一個hadoop目錄:mkdir /hadoop)
			scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop06:/home/hadoop/app/
			scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop07:/home/hadoop/app/
			
			注意:修改hadoop06、hadoop07對應/hadoop/zookeeper-3.4.5/tmp/myid內容
			hadoop06:
				echo 2 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
			hadoop07:
				echo 3 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
	
	2.安裝配置hadoop叢集(在hadoop00上操作)
		2.1解壓
			tar -zxvf hadoop-2.6.4.tar.gz -C /home/hadoop/app/
		2.2配置HDFS(hadoop2.0所有的配置檔案都在$HADOOP_HOME/etc/hadoop目錄下)
			#將hadoop新增到環境變數中
			vim /etc/profile
			export JAVA_HOME=/usr/java/jdk1.7.0_55
			export HADOOP_HOME=/hadoop/hadoop-2.6.4
			export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
			
			#hadoop2.0的配置檔案全部在$HADOOP_HOME/etc/hadoop下
			cd /home/hadoop/app/hadoop-2.6.4/etc/hadoop
			
			2.2.1修改hadoo-env.sh
				export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55

###############################################################################
				
2.2.2修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bi/</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hdpdata/</value>
</property>

<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>mini5:2181,mini6:2181,mini7:2181</value>
</property>
</configuration>

###############################################################################
				
2.2.3修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為bi,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>bi</value>
</property>
<!-- bi下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.bi</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn1</name>
<value>mini1:9000</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn1</name>
<value>mini1:50070</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn2</name>
<value>mini2:9000</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn2</name>
<value>mini2:50070</value>
</property>
<!-- 指定NameNode的edits元資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value>
</property>
<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.bi</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>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

###############################################################################
			
2.2.4修改mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>	

###############################################################################
			
2.2.5修改yarn-site.xml
<configuration>
<!-- 開啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>mini3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>mini4</value>
</property>
<!-- 指定zk叢集地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>mini5:2181,mini6:2181,mini7:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
			
				
2.2.6修改slaves(slaves是指定子節點的位置,因為要在hadoop01上啟動HDFS、在hadoop03啟動yarn,所以hadoop01上的slaves檔案指定的是datanode的位置,hadoop03上的slaves檔案指定的是nodemanager的位置)
mini5
mini6
mini7

			2.2.7配置免密碼登陸
				#首先要配置hadoop00到hadoop01、hadoop02、hadoop03、hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸
				#在hadoop01上生產一對鑰匙
				ssh-keygen -t rsa
				#將公鑰拷貝到其他節點,包括自己
				ssh-coyp-id hadoop00
				ssh-coyp-id hadoop01
				ssh-coyp-id hadoop02
				ssh-coyp-id hadoop03
				ssh-coyp-id hadoop04
				ssh-coyp-id hadoop05
				ssh-coyp-id hadoop06
				ssh-coyp-id hadoop07
				#配置hadoop02到hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸
				#在hadoop02上生產一對鑰匙
				ssh-keygen -t rsa
				#將公鑰拷貝到其他節點
				ssh-coyp-id hadoop03				
				ssh-coyp-id hadoop04
				ssh-coyp-id hadoop05
				ssh-coyp-id hadoop06
				ssh-coyp-id hadoop07
				#注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置hadoop01到hadoop00的免登陸
				在hadoop01上生產一對鑰匙
				ssh-keygen -t rsa
				ssh-coyp-id -i hadoop00				
		
		2.4將配置好的hadoop拷貝到其他節點
			scp -r /hadoop/ hadoop02:/
			scp -r /hadoop/ hadoop03:/
			scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/
			scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/
			scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/
			scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/
			
			
			
###注意:嚴格按照下面的步驟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		2.5啟動zookeeper叢集(分別在mini5、mini6、mini7上啟動zk)
			cd /hadoop/zookeeper-3.4.5/bin/
			./zkServer.sh start
			#檢視狀態:一個leader,兩個follower
			./zkServer.sh status
			
		2.6啟動journalnode(分別在在mini5、mini6、mini7上執行)
			cd /hadoop/hadoop-2.6.4
			sbin/hadoop-daemon.sh start journalnode
			#執行jps命令檢驗,hadoop05、hadoop06、hadoop07上多了JournalNode程序
		
		2.7格式化HDFS
			#在mini1上執行命令:
			hdfs namenode -format
			#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/hadoop/hadoop-2.6.4/tmp,然後將/hadoop/hadoop-2.6.4/tmp拷貝到hadoop02的/hadoop/hadoop-2.6.4/下。
			scp -r tmp/ hadoop02:/home/hadoop/app/hadoop-2.6.4/
			##也可以這樣,建議hdfs namenode -bootstrapStandby
		
		2.8格式化ZKFC(在mini1上執行一次即可)
			hdfs zkfc -formatZK
		
		2.9啟動HDFS(在mini1上執行)
			sbin/start-dfs.sh

		2.10啟動YARN(#####注意#####:是在hadoop02上執行start-yarn.sh,把namenode和resourcemanager分開是因為效能問題,因為他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
			sbin/start-yarn.sh

		
	到此,hadoop-2.6.4配置完畢,可以統計瀏覽器訪問:
		http://hadoop00:50070
		NameNode 'hadoop01:9000' (active)
		http://hadoop01:50070
		NameNode 'hadoop02:9000' (standby)
	
	驗證HDFS HA
		首先向hdfs上傳一個檔案
		hadoop fs -put /etc/profile /profile
		hadoop fs -ls /
		然後再kill掉active的NameNode
		kill -9 <pid of NN>
		通過瀏覽器訪問:http://192.168.1.202:50070
		NameNode 'hadoop02:9000' (active)
		這個時候hadoop02上的NameNode變成了active
		在執行命令:
		hadoop fs -ls /
		-rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
		剛才上傳的檔案依然存在!!!
		手動啟動那個掛掉的NameNode
		sbin/hadoop-daemon.sh start namenode
		通過瀏覽器訪問:http://192.168.1.201:50070
		NameNode 'hadoop01:9000' (standby)
	
	驗證YARN:
		執行一下hadoop提供的demo中的WordCount程式:
		hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
	
	OK,大功告成!!!

	
			
		
測試叢集工作狀態的一些指令 :
bin/hdfs dfsadmin -report	 檢視hdfs的各節點狀態資訊


bin/hdfs haadmin -getServiceState nn1		 獲取一個namenode節點的HA狀態

sbin/hadoop-daemon.sh start namenode  單獨啟動一個namenode程序


./hadoop-daemon.sh start zkfc   單獨啟動一個zkfc程序
			
			
				

參考:
https://blog.csdn.net/qq_33161208/article/details/80925232
這位作者的部落格,寫真步驟很清晰。