前提條件
先搭建 http://www.cnblogs.com/raphael5200/p/5152004.html 的環境,然後在其基礎上進行修改
一、安裝Zookeeper
由于環境有限,是以在僅有的4台虛拟機上完成多個操作;
a.在4台虛拟中選3台安裝Zookeeper,我選 node5 node6 node7
b.在4台虛拟中選3台作為JournalNode的節點,我選node6 node7 node8
c..在4台虛拟中選2台作為NameNode ,我選node5(Active) node8(Standby)
1.解壓并移動
下載下傳并解壓zookper壓縮包,将zookeeper複制到/usr/local/zookeeper目錄下;
2.配置Zookeeper
$ cd /usr/local/zookeeper/
$ vim /conf/zoo.cfg
#寫入
tickTime=2000
dataDir=/opt/zookeeper #指定Zookeeper的Data目錄
clientPort=2181
initLimit=5
syncLimit=2
# 3台節點
server.1=node5:2888:3888
server.2=node6:2888:3888
server.3=node7:2888:3888
3.配置zookeeper的環境變量
$ vim /root/.bash_profile
#寫入
PATH=$PATH:/usr/local/zookeeper-3.4.6/bin
4.覆寫node6 和 node7的zookeeper配置檔案和.bash_profile
5.建立myid
分别在node5 node6 node7的dataDir目錄中建立一個myid的檔案,檔案内容分别為1,2,3(即server的id)
Node 5:
$ vim /opt/zookeeper/myid
#寫入
1
Node 6:
$ vim /opt/zookeeper/myid
#寫入
2
Node 7:
$ vim /opt/zookeeper/myid
#寫入
3
6.啟動zookeeper
$ cd /usr/local/zookeeper
$ bin/zkServer.sh start
# 顯示:Starting zookeeper ... STARTED 表示啟動成功
二、免密碼登入
node5 node8 兩台NameNode互相做免密碼登入,在上一文中已經在node5上做了免密碼登入,下面隻在Node8上做node5的免密碼登入:
Node8:
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ scp ~/.ssh/id_dsa.pub root@node5:/opt
Node5:
$ cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
完成以後,測試一下 node8 $: ssh node5
三、配置HDFS 高可用
1.配置HDFS配置檔案
$ cd /usr/local/hadoop-2.5.1/etc/hadoop
$ vi hdfs-site.xml
#寫入
<configuration>
#配置NameService 名字随便起
<property>
<name>dfs.nameservices</name>
<value>raphael</value>
</property>
# 這裡的最後一個名字就是上面的nameService value是兩台NameNode的節點
<property>
<name>dfs.ha.namenodes.raphael</name>
<value>node5,node8</value>
</property>
# node5和node8的rpc位址
<property>
<name>dfs.namenode.rpc-address.raphael.node5</name>
<value>node5:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.raphael.node8</name>
<value>node8:8020</value>
</property>
# node5和node8的http位址
<property>
<name>dfs.namenode.http-address.raphael.node5</name>
<value>node5:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.raphael.node8</name>
<value>node8:50070</value>
</property>
# 3台JournalNode位址,背景跟名字,但後面的名字不能與nameService相同
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node6:8485;node7:8485;node8:8485/raphael5200</value>
</property>
#配置用戶端調用接口
<property>
<name>dfs.client.failover.proxy.provider.raphael</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<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>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
#配置journalnode目錄
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/journalnode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
$ vi core-site.xml
#這裡的value就是NameService的名字
<property>
<name>fs.defaultFS</name>
<value>hdfs://raphael</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop</value>
</property>
#3台zookeeper節點
<property>
<name>ha.zookeeper.quorum</name>
<value>node5:2181,node6:2181,node7:2181</value>
</property>
a.删除node5 node6 node7 node8 etc/hadoop/masters檔案(這裡已經不需要standry了)
b.删除node5 node6 node7 node8 上的hadoop.tmp.dir 目錄
$ rm -rf /opt/hadoop
c.将node5 配置好的檔案,覆寫到node6 node7 node8
$ scp -r etc/hadoop/* root@node6:/usr/local/hadoop/etc/hadoop
$ scp -r etc/hadoop/* root@node7:/usr/local/hadoop/etc/hadoop
$ scp -r etc/hadoop/* root@node8:/usr/local/hadoop/etc/hadoop
2.覆寫并啟動
a.啟動三台JournalNode node6 node7 node8
# 前提是要先把zookeeper啟動起來
$ sbin/hadoop-daemon.sh start journalnode
b.在其中一個NameNode上格式化hadoop.tmp.dir 并初始化
Node5:
$ bin/hdfs namenode -format
c.把格式化後的中繼資料拷備到另一台NameNode節點上
$ scp -r /opt/hadoop root@node8:/opt/hadoop
d.啟動NameNode
Node5:
$ sbin/hadoop-daemon.sh start namenode
Node8:
$ bin/hdfs namenode -bootstrapStandby
$ sbin/hadoop-daemon.sh start namenode
e.初始化zkfc
Node5:
$ bin/hdfs zkfc -formatZK
f.全面停止并全面啟動
Node5:
$ sbin/stop-dfs.sh
$ sbin/start-dfs.sh
注:在啟動JournalNode和其他項時,沒有其他好的方法較驗是否啟動成功,隻能檢視日志檔案,如果日志檔案沒有報錯,則表示啟動成功;
3.通路NameNode
通路兩台NameNode node5和node8的50070端口,會顯示一個端口是Active 另一個端口是Standby 如下圖:
http://node5:50070 http://node8:50070
注:如果Node5突然挂掉了,那麼node8備用的NameNode會自動的補上,替換為Active,測試方法:Kill node5 的nameNode程序,然後再重新整理Node8:
$ jps #ps是顯示目前系統程序 ,jps就是顯示目前系統的java 程序
$ kill -9 程序ID #殺掉程序
四、使用Yarn來排程HDFS
#先所有的Hadoop相關程序
$ stop-dfs.sh
1.配置yarn-site.xml
$ cd /usr/local/hadoop/
$ vim etc/hadoop/yarn-site.xml
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
# 該cluster-id不能與nameService相同
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>raphael521</value>
</property>
#指定2台Resource Manager (即Name Node )節點
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node5</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node8</value>
</property>
#指定zookeeper 節點
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node6:2181,node7:2181,node8:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.配置etc/hadoop/mapred-site.xml
$ vim etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.将mapred-site.xml yarn-site.xml 覆寫到其他的節點上
4.啟動 yarn
#單獨啟動yarn使用指令:
$ sbin/start-yarn.sh
$ sbin/stop-yarn.sh
#啟動所有Hadoop相關程序使用指令
$ start-all.sh
#啟動完成以後,另一台NameNode需要手動啟動yarn
$ start-yarn.sh
5.通路
通路yarn的端口 http://node5:8088 http://node8:8088 可以看到:
說明:當通路Node5的時候能夠正常的顯示界面,并且在Nodes下還能加載出叢集的所有節點,但是通路node8的時候,則不會顯示,而是提示頁面将跳到Active的Resource Manager (RM)節點上,然後頁面就跳了;
當node5突然挂掉了,zookeeper會立刻将RM切換到node8上,将node8做為Active的RM,然後在Nodes下會在幾十秒内加載出所有節點;