一:注意事項和準備工作
? 1.1 ?準備3臺Linux,可以ubuntu或者centOS ,本機設備性能不高,建議用設置開機進入命令行,然后用遠程操作
? 1.2 ?a .linux 必須關掉防火墻 ?b.設置ip和主機名并且配置ip和主機映射關系(不懂百度一下)
? ? ? ? ?b.用root用戶進行操作,后面可以遇到最大limit文件數的問題,root可以直接操作,比較方便!
?1.3 群集規劃
二:操作步驟
?2.1 安裝jdk并設置環境變量(不懂可以看上一篇Hadoop偽分布搭建)
?2.2?配置免密碼登陸
? ?a.?#首先要配置sunshine02到sunshine02、sunshine03、sunshine04的免密碼
? ?b.?#在sunshine02上生產一對鑰匙?
? ? ? ? ? ? ? ? ? ssh-keygen -t rsa
? ?c .#將公鑰拷貝到其他節點,包括自己
? ? ? ? ? ? ? ? ? ssh-copy-id sunshine02
? ? ? ? ? ? ? ? ? ssh-copy-id sunshine03
? ? ? ? ? ? ? ? ? ssh-copy-id sunshine04
? d.?sunshine03到sunshine02、sunshine03、sunshine04的免密碼同上操作
? e.?sunshine04到sunshine02、sunshine03、sunshine04的免密碼同上操作
? f. 注意:兩個namenode之間要配置ssh免密碼登陸
?2.3?安裝配置zooekeeper集群(在sunshine02上)
? a.?解壓tar -zxvf zookeeper-3.4.5.tar.gz -C /home/linwentao/desktop/app ? (后面自己路徑可以自己定義)
? b.?修改配置
? ? ? ? ? ? cd /home/linwentao/desktop/app/zookeeper-3.4.5/conf/
? ? ? ? ? ? cp zoo_sample.cfg zoo.cfg
? ? ? ? ? ? vim zoo.cfg ?修改:dataDir=/home/linwentao/desktop/app/zookeeper-3.4.5/tmp
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataLogDir=/home/zookeeper/logs
? ? ? ? ? ? 在最后添加:
? ? ? ? ? ?server.1=sunshine02:2888:3888
? ? ? ? ? ?server.2=sunshine03:2888:3888
? ? ? ? ? ?server.3=sunshine04:2888:3888
? ? ? ? ? 保存退出
? ? ? ? ?創建一個tmp和logs文件夾
? ? ? ? ? mkdir /home/linwentao/desktop/app/zookeeper-3.4.5/tmp
? ? ? ? ? mkdir /home/linwentao/desktop/app/zookeeper-3.4.5/logs
? ? ? ? ? ?創建一個空文件
? ? ? ? ? ?touch /home/linwentao/desktop/app/zookeeper-3.4.5/tmp/myid
? ? ? ? ? ?向該文件寫入ID?
? ? ? ? ? ? echo 1 > /home/linwentao/desktop/app/zookeeper-3.4.5/tmp/myid
?c.?將配置好的zookeeper拷貝到其他節點(sunshine03,sunshine04)
? ? scp -r /home/linwentao/desktop/app/zookeeper-3.4.5/ ?sunshine03:/home/linwentao/desktop/app/
? ? scp -r /home/linwentao/desktop/app/zookeeper-3.4.5/ ?sunshine04:/home/linwentao/desktop/app/
? ? 注意:必須修改sunshine03、sunshine04 里面的myid的值(對應值為前面配置zoo.cfg最后server后面的數值)
? ? sunshine03-----2 ? ? ? ?sunshine04----3
2.4 安裝hadoop群集
? a. 先對一臺進行安裝,然后進行復制或傳輸即可
? b .修改core-site.xml
? ?<configuration>
? ? ? ? ?<!-- 指定hdfs的nameservice 為ns1--->
? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? <name>fs.defaultFS</name>
? ? ? ? ? ? ? ? ? ? ? ? ? <value>hdfs//ns1</value>
? ? ? ? ? ?</property>
? ? ? ? ? <!-- 指定hadoop臨時目錄 -->
? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <name>hadoop.tmp.dir</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>/home/linwentao/desktop/app/hadoop-2.4.1/tmp</value>
? ? ? ? ? ? </property>
? ? ? ? ? ? <!-- 指定zookeeper地址 -->
? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <name>ha.zookeeper.quorum</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<value>sunshine02:2181,sunshine03:2181,sunshine04:2181</value>?
? ? ? ? ? ? ? ? </property>
? </configuration>
? ?c. 修改hdfs-site.xml
? ? ? ? ? <configuration>
? ? ? ? ? ? ? ?<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
? ? ? ? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <name>dfs.nameservices</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>ns1</value>
? ? ? ? ? ? ? ? ? ?</property>
? ? ? ? ? ? ? ? ? ? <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
? ? ? ? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<name>dfs.ha.namenodes.ns1</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>nn1,nn2</value>
? ? ? ? ? ? ? ? ? ?</property>
? ? ? ? ? ? ? ? ? <!-- nn1的RPC通信地址 -->
? ? ? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? <name>dfs.namenode.rpc-address.ns1.nn1</name>
? ? ? ? ? ? ? ? ? ? ? ? ? <value>sunshine02:9000</value>
? ? ? ? ? ? ? ? ? </property>
? ? ? ? ? ? ? ? ?<!-- nn1的http通信地址 -->
? ? ? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <name>dfs.namenode.http-address.ns1.nn1</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>sunshine02:50070</value>
? ? ? ? ? ? ? ? ?</property>
? ? ? ? ? ? ? ? ? <!-- nn2的RPC通信地址 -->
? ? ? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? ?<name>dfs.namenode.rpc-address.ns1.nn2</name>
? ? ? ? ? ? ? ? ? ? ? ? ? <value>sunshine03:9000</value>
? ? ? ? ? ? ? ? ? ? </property>
? ? ? ? ? ? ? ? ?<!-- nn2的http通信地址 -->
? ? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? ?<name>dfs.namenode.http-address.ns1.nn2</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<value>sunshine03:50070</value>
? ? ? ? ? ? ? ? </property>
? ? ? ? ? ? ? <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? <name>dfs.namenode.shared.edits.dir</name>
? ? ? ? ? ? ? ? ? ? ?<value>qjournal://sunshine02:8485;sunshine03:8485;sunshine04:8485/ns1</value> ?
? ? ? ? ? ? ? </property>
? ? ? ? ? ? ?<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? <name>dfs.journalnode.edits.dir</name>
? ? ? ? ? ? ? ? ? ? ? ? ?<value>/home/linwentao/desktop/app/hadoop-2.4.1/journaldata</value> ?
? ? ? ? ? ? ?</property>
? ? ? ? ? ? ? <!-- 開啟NameNode失敗自動切換 -->
? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ?<name>dfs.ha.automatic-failover.enabled</name>
? ? ? ? ? ? ? ? ? ? ?<value>true</value>
? ? ? ? ? ? ? </property>
? ? ? ? ? ? ?<!-- 配置失敗自動切換實現方式 -->
? ? ? ? ? ?<property>?
? ? ? ? ? ? ? ? ? <name>dfs.client.failover.proxy.provider.ns1</name>
? ? ? ? ? ? ? ? ? <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> ? ? ? ? ? ? ? ?
? ? ? ? ? </property>
? ? ? ? ? ? ? <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ?<name>dfs.ha.fencing.methods</name>
? ? ? ? ? ? ? ? ? ? ? ? ? <value>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sshfence
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?shell(/bin/true)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </value>
? ? ? ? ? ? ? ? ? ?</property>
? ? ? ? ? ? ? ? ? ? ? < !-- 使用sshfence隔離機制時需要ssh免登陸 -->
? ? ? ? ? ? ? ? ? ? <property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <name>dfs.ha.fencing.ssh.private-key-files</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>/home/root/.ssh/id_rsa</value>
? ? ? ? ? ? ? ? ? ? </property>
? ? ? ? ? ? ? ? ? ?<!-- 配置sshfence隔離機制超時時間 -->
? ? ? ? ? ? ? ? ? ?<property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<name>dfs.ha.fencing.ssh.connect-timeout</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>30000</value>
? ? ? ? ? ? ? ? ? ? ?</property>
? ? ? ?</configuration>
?d.修改mapred-site.xml
? ? ? ? ? ? ?<configuration>
????????????????????????????<!-- 指定mr框架為yarn方式 -->
????????????????????????????<property>
????????????????????????????????????????<name>mapreduce.framework.name</name>
????????????????????????????????????????<value>yarn</value>
????????????????????????????????</property>
????????????</configuration>
e.修改yarn-site.xml
? ? ? ? ? ? ? ? <configuration>
????????????????????????????????????<!-- 開啟RM高可用 -->
????????????????????????????????????<property>
????????????????????????????????????????????????? <name>yarn.resourcemanager.ha.enabled</name>
????????????????????????????????????????????????? <value>true</value>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?</property>
????????????????????????????????????<!-- 指定RM的cluster id -->
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<property>
????????????????????????????????????????????????? <name>yarn.resourcemanager.cluster-id</name>
????????????????????????????????????????????????????? <value>yrc</value>
????????????????????????????????????????????</property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <!-- 指定RM的名字 -->
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <property>
????????????????????????????????????????????????? <name>yarn.resourcemanager.ha.rm-ids</name>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <value>rm1,rm2</value>
????????????????????????????????????????</property>
????????????????????????????????????<!-- 分別指定RM的地址 -->
????????????????????????????????????????<property>
? ????????????????????????????????????????????????<name>yarn.resourcemanager.hostname.rm1</name>
????????????????????????????????????????????????? <value>sunshine02</value>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?</property>
????????????????????????????????????????????<property>
? ????????????????????????????????????????????????????<name>yarn.resourcemanager.hostname.rm2</name>
????????????????????????????????????????????????????? <value>sunshine03</value>
????????????????????????????????????????????</property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<!-- 指定zk集群地址 -->
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<property>
? ????????????????????????????????????????????<name>yarn.resourcemanager.zk-address</name>
? ?????????????????????????????????????????????<value>sunshine02:2181,sunshine03:2181,sunshine04:2181</value>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </property>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <property>
????????????????????????????????????????????????? <name>yarn.nodemanager.aux-services</name>
????????????????????????????????????????????????? <value>mapreduce_shuffle</value>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?</property>
? ? ? ? ? ? ?</configuration>
? f .修改slaves(slaves是指定子節點的位置,因為要在sunshine02上啟動HDFS、在sunshine03啟動yarn,所以sunshine02上的slaves文件指定的是 ? ? ?datanode的位置,sunshine03上的slaves文件指定的是nodemanager的位置)
? ? ? sunshine02 ? : sunshine02、sunshine03、sunshine04
? ? ? sunshine03 ? : sunshine02、sunshine03、sunshine04
三:啟動操作(嚴格按照下面的步驟)
? ?3.1?啟動zookeeper集群(分別在sunshine02、sunshine03、sunshine04上啟動zk)
? ? ? ? ? ? ?cd /home/linwentao/desktop/app/zookeeper-3.4.5/bin/
? ? ? ? ? ? ?./zkServer.sh start
? ? ? ? ? ?#查看狀態:一個leader,兩個follower
? ? ? ? ? ?./zkServer.sh status
?3.2?啟動journalnode(分別在在sunshine02、sunshine03、sunshine04上執行)
? ? ? ? ? ? ? ? ? ?cd /home/linwentao/desktop/app/hadoop-2.4.1
? ? ? ? ? ? ? ? ? sbin/hadoop-daemon.sh start journalnode
? ? ?#運行jps命令檢驗,sunshine02、sunshine03、sunshine04上多了JournalNode進程
3.3?格式化HDFS
? ? ? #在weekend01上執行命令:?hdfs namenode -format
? ? ? #格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配??置的是/home/linwentao/desktop/app/hadoop- ? ? ? ? ? ? ? ? ? ? ? ? 2.4.1/?tmp,然后將/home/linwentao/desktop/app/hadoop-2.4.1/ tmp拷貝到sunshine03的/weekend/hadoop-2.4.1/下。
? ? ? ? ? ? ? scp -r tmp/ ?sunshine03:/home/linwentao/desktop/app/hadoop-2.4.1/
3.4?格式化ZKFC(在sunshine02上執行即可)
? ? ? ? ? ? hdfs zkfc -formatZK
3.5?啟動HDFS(在sunshine02上執行)
? ? ? ? ? start-dfs.sh
3.6?啟動YARN(可以在sunshine02、sunshine03、sunshine04其中一臺開,建議在sunshine04,?為把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
四:驗證
?http://192.168.157.140:50070
NameNode 'sunshine02:9000' (active)
http://1192.168.157.141:50070
NameNode 'sunshine03:9000' (standby)
驗證HDFS HA
首先向hdfs上傳一個文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通過瀏覽器訪問:http://192.168.157.141:50070
NameNode 'sunshine03:9000' (active)
這個時候weekend02上的NameNode變成了active
在執行命令:
hadoop fs -ls /
剛才上傳的文件依然存在!!!
手動啟動那個掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過瀏覽器訪問:http://192.168.157.140:50070
NameNode 'sunshine02:9000' (standby)
OK,大功告成!!!
測試集群工作狀態的一些指令 :
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進程