1. 程式人生 > >HA機制的大資料叢集的搭建過程

HA機制的大資料叢集的搭建過程

叢集規劃

在這裡插入圖片描述 說明: 1、在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。主備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、 準備Linux環境

所有節點都需配置。

1.1、修改Linux主機名

vi /etc/sysconfig/network
1.	NETWORKING=yes
2.	HOSTNAME=ha1 ###自定義主機名

1.2、修改IP

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

3.	DEVICE=eth0
4.	TYPE=Ethernet
5.	ONBOOT=yes
6.	NM_CONTROLLED=yes
7.	BOOTPROTO=static
8.	IPADDR=192.168.112.200
9.	GATEWAY=192.168.112.2 ###閘道器地址和子網IP不要重複
10.	NETMASK=255.255.255.0
11.	DNS=192.168.112.2

1.3、修改主機名和IP的對映關係

vim /etc/hosts
1.	192.168.112.21 ha2
2.	192.168.112.22 ha3
3.	192.168.112.20 ha1

1.4、關閉防火牆

#檢視防火牆狀態
service iptables status
#關閉防火牆
service iptables stop
#檢視防火牆開機啟動狀態
chkconfig iptables --list
#關閉防火牆開機啟動
chkconfig iptables off

1.5、ssh免登陸(主節點和從節點之間)

在ha1上生產一對鑰匙
ssh-keygen -t rsa
#將公鑰拷貝到其他節點,包括自己
ssh-coyp-id ha1
ssh-coyp-id ha2
……
#配置ha2到ha3、ha4、ha5的免密碼登陸
#在ha2上生產一對鑰匙
ssh-keygen -t rsa
#將公鑰拷貝到其他節點
ssh-coyp-id ha2				
ssh-coyp-id ha3
……
#注意:兩個namenode之間要配置ssh免密碼登陸
#在ha2上執行
ssh-coyp-id ha1				
				
驗證:
ssh ha1
exit

2、 安裝JDK

所有節點都需配置

2.1、上傳

2.2、解壓jdk

建立資料夾
mkdir /home/hadoop/app
#解壓
tar -zxvf jdk-7u55-linux-i586.tar.gz -C /home/hadoop/app

2.3、將java新增到環境變數中

vim /etc/profile

#在檔案最後新增
4.	export JAVA_HOME=/home/hadoop/app/jdk-7u_65-i585
5.	export PATH=$PATH:$JAVA_HOME/bin

2.4、重新整理配置

source /etc/profile

2.5、驗證

Jsp

3、安裝zookeeper

版本:3.4.5 安裝配置zooekeeper叢集(在ha1、ha2、ha3上)

3.1、解壓

tar -zxvf zookeeper-3.4.5.tar.gz -C /home/hadoop/app/

3.2、修改環境變數

vi /etc/profile
#新增內容:
6.	export ZOOKEEPER_HOME=/root/hadoop/zookeeper
7.	export PATH=$PATH:$ZOOKEEPER_HOME/bin

3.3、重新整理配置

source /etc/profile

3.4、修改配置檔案

cd /home/hadoop/app/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=/root/apps/zookeeper-3.4.5/tmp
在最後新增:
8.	server.1=ha1:2888:3888
9.	server.2=ha2:2888:3888
10.	server.3=ha3:2888:3888

儲存退出
然後建立一個tmp資料夾:
mkdir /home/hadoop/app/zookeeper-3.4.5/tmp
echo 1 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid

3.5、將配置好的zookeeper拷貝到其他節點

首先分別在ha2、ha3根目錄下建立一個hadoop目錄:mkdir /Hadoop

scp -r /home/hadoop/app/zookeeper-3.4.5/ ha2:/home/hadoop/app/
scp -r /home/hadoop/app/zookeeper-3.4.5/ ha3:/home/hadoop/app/

注意:修改ha2、ha3對應/hadoop/zookeeper-3.4.5/tmp/myid內容 Ha2:

echo 2 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid ha3: echo 3 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid

4、安裝配置hadoop叢集

版本:2.6.4 在ha1上操作。

4.1、解壓

tar -zxvf hadoop-2.6.4.tar.gz -C /home/hadoop/app/

4.2、修改環境變數

hadoop2.0所有的配置檔案都在$HADOOP_HOME/etc/hadoop目錄下。

#將hadoop新增到環境變數中
vim /etc/profile

11.	export HADOOP_HOME=/hadoop/hadoop-2.6.4
12.	export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4.3、修改hadoop配置檔案

cd /home/hadoop/app/hadoop-2.6.4/etc/hadoop

13.	export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55			

4.3.2修改core-site.xml

14.	<configuration>  
15.	<!-- 指定hdfs的nameservice為ns1 -->  
16.	<property>  
17.	<name>fs.defaultFS</name>  
18.	<value>hdfs://bi/</value>  
19.	</property>  
20.	<!-- 指定hadoop臨時目錄 -->  
21.	<property>  
22.	<name>hadoop.tmp.dir</name>  
23.	<value>/home/hadoop/app/hdpdata/</value>  
24.	</property>  
25.	  
26.	<!-- 指定zookeeper地址 -->  
27.	<property>  
28.	<name>ha.zookeeper.quorum</name>  
29.	<value>mini5:2181,mini6:2181,mini7:2181</value>  
30.	</property>  
31.	</configuration> 

4.3.3修改hdfs-site.xml

32.	<configuration>
33.	<!--指定hdfs的nameservice為bi,需要和core-site.xml中的保持一致 -->
34.	<property>
35.	<name>dfs.nameservices</name>
36.	<value>bi</value>
37.	</property>
38.	<!-- bi下面有兩個NameNode,分別是nn1,nn2 -->
39.	<property>
40.	<name>dfs.ha.namenodes.bi</name>
41.	<value>nn1,nn2</value>
42.	</property>
43.	<!-- nn1的RPC通訊地址 -->
44.	<property>
45.	<name>dfs.namenode.rpc-address.bi.nn1</name>
46.	<value>ha1:9000</value>
47.	</property>
48.	<!-- nn1的http通訊地址 -->
49.	<property>
50.	<name>dfs.namenode.http-address.bi.nn1</name>
51.	<value>ha1:50070</value>
52.	</property>
53.	<!-- nn2的RPC通訊地址 -->
54.	<property>
55.	<name>dfs.namenode.rpc-address.bi.nn2</name>
56.	<value>ha2:9000</value>
57.	</property>
58.	<!-- nn2的http通訊地址 -->
59.	<property>
60.	<name>dfs.namenode.http-address.bi.nn2</name>
61.	<value>ha2:50070</value>
62.	</property>
63.	<!-- 指定NameNode的edits元資料在JournalNode上的存放位置 -->
64.	<property>
65.	<name>dfs.namenode.shared.edits.dir</name>
66.	<value>qjournal://ha3:8485/bi</value>
67.	</property>
68.	<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
69.	<property>
70.	<name>dfs.journalnode.edits.dir</name>
71.	<value>/home/hadoop/journaldata</value>
72.	</property>
73.	<!-- 開啟NameNode失敗自動切換 -->
74.	<property>
75.	<name>dfs.ha.automatic-failover.enabled</name>
76.	<value>true</value>
77.	</property>
78.	<!-- 配置失敗自動切換實現方式 -->
79.	<property>
80.	<name>dfs.client.failover.proxy.provider.bi</name>
81.	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
82.	</property>
83.	<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
84.	<property>
85.	<name>dfs.ha.fencing.methods</name>
86.	<value>
87.	sshfence
88.	shell(/bin/true)
89.	</value>
90.	</property>
91.	<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
92.	<property>
93.	<name>dfs.ha.fencing.ssh.private-key-files</name>
94.	<value>/root/.ssh/id_rsa</value>
95.	</property>
96.	<!-- 配置sshfence隔離機制超時時間 -->
97.	<property>
98.	<name>dfs.ha.fencing.ssh.connect-timeout</name>
99.	<value>30000</value>
100.	</property>
101.	</configuration>

4.3.4修改mapred-site.xml

102.	<configuration>
103.	<!-- 指定mr框架為yarn方式 -->
104.	<property>
105.	<name>mapreduce.framework.name</name>
106.	<value>yarn</value>
107.	</property>
108.	</configuration>	

4.3.5修改yarn-site.xml

109.	<configuration>
110.	<!-- 開啟RM高可用 -->
111.	<property>
112.	<name>yarn.resourcemanager.ha.enabled</name>
113.	<value>true</value>
114.	</property>
115.	<!-- 指定RM的cluster id -->
116.	<property>
117.	<name>yarn.resourcemanager.cluster-id</name>
118.	<value>yrc</value>
119.	</property>
120.	<!-- 指定RM的名字 -->
121.	<property>
122.	<name>yarn.resourcemanager.ha.rm-ids</name>
123.	<value>rm1,rm2</value>
124.	</property>
125.	<!-- 分別指定RM的地址 -->
126.	<property>
127.	<name>yarn.resourcemanager.hostname.rm1</name>
128.	<value>ha1</value>
129.	</property>
130.	<property>
131.	<name>yarn.resourcemanager.hostname.rm2</name>
132.	<value>ha2</value>
133.	</property>
134.	<!-- 指定zk叢集地址,用來儲存RM的狀態,配置三個節點(三份資料)就OK了 -->
135.	<property>
136.	<name>yarn.resourcemanager.zk-address</name>
137.	<value>ha3:2181</value>
138.	</property>
139.	<property>
140.	<name>yarn.nodemanager.aux-services</name>
141.	<value>mapreduce_shuffle</value>
142.	</property>
143.	</configuration>

4.3.6修改slaves slaves是指定子節點的位置,因為要在ha1上啟動HDFS、yarn,所以ha1上的slaves檔案指定的是datanode、nodemanager的位置。新增需要的節點:

144.	ha3

4.4、將配置好的hadoop拷貝到其他節點

scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/
scp -r /hadoop/hadoop-2.6.4/ [email protected]:/hadoop/

4.5、初始化叢集的步驟

注意:嚴格按照下面的步驟!!! 4.5.1啟動zookeeper叢集 分別在ha1、ha2、ha3上啟動zk

cd /hadoop/zookeeper-3.4.5/bin/
	./zkServer.sh start
	#檢視狀態:一個leader,兩個follower
	./zkServer.sh status

4.5.2啟動journalnode 在ha3上啟動journalnode

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

4.5.3格式化HDFS 在ha1上執行命令:

hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/hadoop/hadoop-2.6.4/tmp,然後將/hadoop/hadoop-2.6.4/tmp拷貝到ha2的/hadoop/hadoop-2.6.4/下。

scp -r tmp/ hadoop02:/home/hadoop/app/hadoop-2.6.4/

##也可以這樣,建議hdfs namenode -bootstrapStandby

4.5.4格式化ZKFC 在ha1上執行一次即可

hdfs zkfc -formatZK

4.5.5啟動HDFS 在ha1上執行

sbin/start-dfs.sh

4.5.6啟動YARN 分別在ha1、ha2上啟動ResourceManager

sbin/start-yarn.sh

4.6、驗證叢集的配置

hadoop-2.6.4配置完畢,驗證叢集的配置。 可以統計瀏覽器訪問: http://ha1:50070 NameNode ‘hadoop01:9000’ (active) http://ha2:50070 NameNode ‘hadoop02:9000’ (standby)

4.6.1驗證HDFS HA 首先向hdfs上傳一個檔案

hadoop fs -put /etc/profile /profile

#檢視上傳到hdfs的檔案

hadoop fs -ls /

然後再kill掉active的NameNode

kill -9 <pid of NN>

通過瀏覽器訪問:http://ha2:50070 NameNode ‘hadoop02:9000’ (active) 這個時候ha2上的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://ha1:50070 NameNode ‘ha1:9000’ (standby)

4.6.2驗證YARN: 執行一下hadoop提供的demo中的WordCount程式:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
無報錯,OK,大功告成! 

4.6.3測試叢集工作狀態的一些指令

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程序