前提條件html
先搭建 http://www.cnblogs.com/raphael5200/p/5152004.html 的環境,而後在其基礎上進行修改java
1、安裝Zookeepernode
因爲環境有限,因此在僅有的4臺虛擬機上完成多個操做;apache
a.在4臺虛擬中選3檯安裝Zookeeper,我選 node5 node6 node7bootstrap
b.在4臺虛擬中選3臺做爲JournalNode的節點,我選node6 node7 node8vim
c..在4臺虛擬中選2臺做爲NameNode ,我選node5(Active) node8(Standby)bash
1.解壓並移動ssh
下載並解壓zookper壓縮包,將zookeeper複製到/usr/local/zookeeper目錄下;ide
2.配置Zookeeperoop
$ 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 表示啓動成功
2、免密碼登陸
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
3、配置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 #殺掉進程
4、使用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下會在幾十秒內加載出全部節點;