文章目錄
- 集群規劃
- 1、 準備Linux環境
- 1.1、修改Linux主機名
- 1.3、修改主機名和IP的映射關系
- 1.4、關閉防火墻
- 1.5、ssh免登陸(主節點和從節點之間)
- 2、 安裝JDK
- 2.1、上傳
- 2.2、解壓jdk
- 2.3、將java添加到環境變量中
- 2.4、刷新配置
- 2.5、驗證
- 3、安裝zookeeper
- 3.1、解壓
- 3.2、修改環境變量
- 3.3、刷新配置
- 3.4、修改配置文件
- 3.5、將配置好的zookeeper拷貝到其他節點
- 4、安裝配置hadoop集群
- 4.1、解壓
- 4.2、修改環境變量
- 4.3、修改hadoop配置文件
- 4.4、將配置好的hadoop拷貝到其他節點
- 4.5、初始化集群的步驟
- 4.6、驗證集群的配置
集群規劃
說明:
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進行協調。
集群環境:
Hadoop2.6.4+Hive2.1.1+Hbase2.0.0+Zookeeper3.4.5+JDK1.8+Centos6.9+Sqoop1.4.6
這里只說下hadoop的搭建過程,其他組件的安裝過程可參考我的其他文章:
Hive2.1.1:https://blog.csdn.net/qq_16633405/article/details/78278979
Hbase2.0.0:https://blog.csdn.net/qq_16633405/article/details/81908283
Sqoop1.4.6:https://blog.csdn.net/qq_16633405/article/details/82224289
1、 準備Linux環境
所有節點都需配置。
1.1、修改Linux主機名
vi /etc/sysconfig/network
1. NETWORKING=yes
2. HOSTNAME=ha1 ###自定義主機名
1.2、修改IP
vim /etc/sysconfig/network-scripts/ifcfg-eth03. 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/profile11. 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
4.3.1修改hadoo-env.sh
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/ hadoop@ha2:/hadoop/
scp -r /hadoop/hadoop-2.6.4/ hadoop@ha3:/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.4sbin/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進程