HA: High Available(高可用集羣)
本次安裝的hadoop2.5.2是64bit的,如果需要請在我之前的博文中
規劃節點數:(僅考慮HDFS 的HA)
HDFS的節點分配:
兩個NN 且分佈在兩臺主機
三個DN節點
三個JN節點
兩個ZKFC節點(必須和NN放在一臺主機上)
三個Zookeeper
Mapreduce的節點:
一個ResourceManager(替代1.x時的JobTracker)
三個DATAManager(替代1.x時的TaskTracker)和DN節點數相同
主機名 | NN | DN | ZK | ZKFC | JN | RM | DM |
Node0 | 1 | 1 | 1 | 1 | |||
Node1 | 1 | 1 | 1 | 1 | 1 | 1 | |
Node2 | 1 | 1 | 1 | 1 | |||
Node3 | 1 | 1 | 1 |
具體步驟:
一、# ln -sf /root/hadoop-2.5.2 /home/hadoop2.5.2
二、修改配置文件(hadoop2.5.2/etc/hadoop)
# vim hadoop-env.sh //修改JAVA_HOME
# vim slaves //配置DN的主機
node1 //DN1節點的主機
node2 //DN2節點的主機
node3 //DN3節點的主機
注意:因爲hadoop2.x沒有了SecondNode了,因此不要配master文件
# vim hdfs-site.xml
<configuration>
<!--首先給搭建的集羣設置一個服務(名字)ID唯一標識,主要是給ZK區別的,因爲zk管理不止Hadoop集羣 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--給NN們設置名字,ID唯一標識-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--根據RPC協議,設置NN的主機:端口號-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node0:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node1:8020</value>
</property>
<!--根據HTTP協議,設置NN的主機:端口號-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node0:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node1:50070</value>
</property>
<!--設置JN的主機和端口號,注意最後要添加集羣服務的名字-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!--添加一個Class類,用於客戶端連接NN(active)-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--設置ssh免密碼登錄,注意私鑰的名字要匹配-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<!--設置JN的工作目錄,否則,默認是當前系統的/tmp,系統重啓後,數據消失-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/jn/data</value>
</property>
<!--以下操作設置,當NN(active)宕機了,自動切換NN(standby)-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
# vim core-site.xml
<configuration>
<!--首先配置NN的入口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--設置zookeeper的節點(主機和端口號)-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node0:2181,node1:2181,node2:2181</value>
</property>
<!--設置hadoop所有文件目錄的根位置,默認是系統/tmp,重啓失效-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop2/</value>
</property>
</configuration>
安裝zookeeper 【zookeeper-3.4.6】
#ln -sf /root/zookeeper-3.4.6 /home/zk
以下操作均在/home/zk下:
配置目錄在,zk/conf/
#cp zoo_sample.cfg zoo.cfg //先將配置文件複製一份,重命名
# vim zoo.cfg
1.dataDir=/opt/zookeeper //修改默認值,默認放在/tmp ,
2.文件最後添加以下幾行
server.1=node0:2888:3888 //zookeeper所在節點的主機名 server.2=mode1:2888:3888 server.3=node2:2888:3888
修改完成後,創建/opt/zookeeper目錄,並創建,編輯文件名爲myid的文件
填充內容爲server.1=node0:2888:3888 server後面的數字,不同節點對應不同數字,
如第二個zookeeper即node1上的節點對應的數字即爲2
將/opt/zookeeper目錄拷貝其他節點上
[root@node0 bin]# scp -r zookeeperroot@node1:/opt/
# scp -r zookeeper root@node2:/opt/
在將zookeeper整個軟件工作目錄拷到其他節點上去
[root@node0 ~]# scp -r zookeeper-3.4.6root@node1:~
# scp -r zookeeper-3.4.6 root@node2:~
別忘記做軟連接
# ln -sf /root/zookeeper-3.4.6 /home/zk
配置Zookeeper的環境變量,寫入/etc/profile,並將其他節點一併改寫
# scp /etc/profile root@node1:/etc/profile
啓動zookeeper
先關閉系統防火牆:# systemctl stop firewalld.service
或者# vim /etc/selinux/config //重啓
每個節點都要啓動:# zkServer.sh start
檢測:
[root@node0 zookeeper-3.4.6]# jps
5403 Jps
5305 QuorumPeerMain
以上完成zookeeper的安裝部署
下面要啓動集羣:
啓動之前,將其他節點安裝Hadoop2.5.2,並將之前的配置文件覆蓋到每個節點,保持每個節點的配置文件相同
# scp ./* root@node1:/home/hadoop2.5.2/etc/hadoop
# scp ./* root@node2:/home/hadoop2.5.2/etc/hadoop
# scp ./* root@node3:/home/hadoop2.5.2/etc/hadoop
目錄切換到/home/hadoop2.5.2/sbin
首先啓動JN :(在JN的節點上啓動,即node1,node2,node3)
[root@node1 sbin]# ./hadoop-daemon.sh start journalnode
[root@node2 sbin]# ./hadoop-daemon.sh start journalnode
[root@node3 sbin]# ./hadoop-daemon.sh start journalnode
2.在任意一個NN的節點主機上(node0或者node1),格式化HDFS,目錄切換到/home/hadoop2.5.2/bin
[root@node0 bin]# ./hdfs namenode –format
3.檢查各個節點是JN是否正常,jps或者去當前格式化NN節點的主機下的/home/hadoop2.5.2/logs 查看JN日誌
4.拷貝當前格式化NN節點的元數據文件(opt/hadoop2/dfs/name/current/*)
官方有推薦命令:
首先啓動當前NN(格式化好的):bin]#./hadoop-daemon.sh start namenode
檢查:jps ,檢查/opt/hadoop2/dfs/name/current有沒有生成元數據文件
[root@node0current]# ll
總用量 16
-rw-r--r--.1 root root 351 6月 4 20:42fsimage_0000000000000000000
-rw-r--r--.1 root root 62 6月 4 20:42 fsimage_0000000000000000000.md5
-rw-r--r--.1 root root 2 6月 4 20:42 seen_txid
-rw-r--r--. 1 root root 205 6月 4 20:42 VERSION
5.官方文檔推薦使用:在沒有格式化的NN節點的主機上執行:bin]#./node –bootstrapStandby
這個命令就是將NN(已經格式化)生成元數據內容拷貝到NN(未格式化)的主機上在沒有格式化的NN主機上檢查有沒有拷貝成功opt/hadoop2/dfs/name/current/*
然而,我自己編譯的源碼,沒這玩意……
不過別擔心,手動移動是一樣有效的,[root@node0 opt]# scp -r hadoop2 root@node1:/opt
6.停止所有HDFS的節點的服務:zookeeper不要停 bin]#./stop-dfs.sh
7.在其中一個NN節點,格式化zkfs bin]# hdfs zkfc -formatZK
8.一次性啓動所有dfs節點:sbin]#./start-dfs.sh
出現下圖及說明安裝無誤:
用瀏覽器訪問node0節點和node1節點,至於誰做active誰做standby完全取決於誰先拿到競爭鎖
瀏覽器訪問測試:(別忘更改自己的hosts文件,否則請用ip地址)
node0:50070 //NN1
node1:50070 // NN2
上牀文件測試一下:
[root@node0 bin]# ./hdfs dfs -mkdir -p/usr/file //HDFS創建目錄
[root@node0 bin]# ./hdfs dfs -put /root/zookeeper-3.4.6.tar.gz /usr/file //上傳文件
這裏說明:Hadoop1.x 默認block大小是64M Hadoop2.x默認block大小是128M
============================================================================
下面配置MapReduce
1. vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2. vim yarn-size.xml
<configuration>
<!--這裏配置ResourceManager的節點主機 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node0</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
將這些配置文件一併拷貝到其他節點主機上
[root@node0 etc]# scp -r hadooproot@node1:/home/hadoop2.5.2/etc
[root@node0 etc]# scp -r hadooproot@node2:/home/hadoop2.5.2/etc
[root@node0 etc]# scp -r hadooproot@node3:/home/hadoop2.5.2/etc
重啓 hadoop
[root@node0 sbin]# ./start-all.sh
瀏覽器訪問 node0:8080