===>?環境架構部署規劃:
bigdata1 NameNode ResourceManager Zookeeper JournalNode failOverController
bigdata2 NameNode ResourceManager Zookeeper JournalNode failOverController
bigdata3 DataNode NodeManager Zookeeper
bigdata4 DataNode NodeManager
===>?準備環境:
(*)清除之前的配置
(*)安裝JDK、修改/etc/hosts文件、關閉防火墻、免密碼登錄
###############################################################################
hdfs-site.xml
<!--nameservice 名子
? 此處必須與core-site文件中fs.defaultFS的值一致-->
? <property>
? ? <name>dfs.nameservices</name>
? ? <value>mycluster</value>
? </property>
??
? <!--ns1 下面有兩個 namenode, nn1,nn2-->
? <property>
? ? <name>dfs.ha.namenodes.mycluster</name>
? ? <value>nn1,nn2</value>
? </property>
??
? <!-- nn1,nn2 的rpc 通信地址-->
? <property>
? ? <name>dfs.namenode.rpc-address.mycluster.nn1</name>
? ? <value>bigdata1:8020</value>
? </property>
? <property>
? ? <name>dfs.namenode.rpc-address.mycluster.nn2</name>
? ? <value>bigdata2:8020</value>
? </property>
??
? <!-- nn1, nn2 的 http 通信地址-->
? <property>
? ? <name>dfs.namenode.http-address.mycluster.nn1</name>
? ? <value>bigdata1:50070</value>
? </property>
? <property>
? ? <name>dfs.namenode.http-address.mycluster.nn2</name>
? ? <value>bigdata2:50070</value>
? </property>
??
? ? <!--指定 JournalNode 的日志在 JournalNode 上的存放位置,ns1 表示保存ns1的日志-->
? <property>
? ? <name>dfs.namenode.shared.edits.dir</name>
? ? <value>qjournal://bigdata1:8485;bigdata2:8485/mycluster</value>
? </property>
? <!-- 配置失敗自動切換實現方式 -->
? <property>
? ? <name>dfs.client.failover.proxy.provider.mycluster</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>
? <!-- 配置隔離機制需要ssh免密碼登陸 -->
? <property>
? ? <name>dfs.ha.fencing.ssh.private-key-files</name>
? ? <value>/root/.ssh/id_rsa</value>
? </property>
? <!-- 配置隔離機制超時時間 -->
? <property>
? ? <name>dfs.ha.fencing.ssh.connect-timeout</name>
? ? <value>30000</value>
? </property>
??
? ? <property>
? ? <name>dfs.journalnode.edits.dir</name>
? ? <value>/data/journal</value>
? </property>
? <!--開啟 NameNode 失敗自動切換?
? 這指定應將群集設置為自動故障轉移。在你的core-site.xml文件中,添加:
??
? <property>?
? ? ?<name> ha.zookeeper.quorum </name>?
? ? ?<value> bigdata1:2181,bigdata2:2181,bigdata3:2181 </value>?
? ?</property>-->
? <property>
? ? ?<name> dfs.ha.automatic-failover.enabled </name>
? ? ?<value>true</value>
? </property>
??
###############################################################################
core-site.xml
<!--HDFS數據保存的目錄,默認是Linux的tmp目錄-->
<property>
? <name>hadoop.tmp.dir</name>
? <value>/data/app/hadoop-2.7.1/tmp/</value>
</property>
<!--指定hdfs 的nameservice 為 ns1-->
<property>
? <name>fs.defaultFS</name>
? <value>hdfs://mycluster</value>
</property>
<!--指定zookeeper的地址-->
<property>
? <name>ha.zookeeper.quorum</name>
? <value>bigdata1,bigdata2,bigdata3</value>
</property>
###############################################################################
?mapred-site.xml
<!--MR程序運行的容器是Yarn-->
<property>
? <name>mapreduce.framework.name</name>
? <value>yarn</value>
</property>
###############################################################################
yarn-site.xml
<!--開啟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>bigdata1</value>
</property>
<property>
? <name>yarn.resourcemanager.hostname.rm2</name>
? <value>bigdata2</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
? <name>yarn.resourcemanager.zk-address</name>
? <value>bigdata1:2181,bigdata2:2181,bigdata3:2181</value>
</property>
<!--NodeManager運行MR任務的方式-->
<property>
? <name>yarn.nodemanager.aux-services</name>
? <value>mapreduce_shuffle</value>
</property>
###############################################################################
slaves
bigdata3
bigdata4
###############################################################################
===>?將配置好的安裝文件拷貝到其它幾臺主機上
scp? -r hadoop-2.7.1? bigdata2:/data/app
scp? -r hadoop-2.7.1? bigdata3:/data/app
scp? -r hadoop-2.7.1? bigdata4:/data/app
===>?啟動journalnode:
hadoop-daemon.sh start journalnode
===>?格式化NameNode
注意,這里需要創建core-site.xml 文件中 hadoop.tmp.dir 所指定的目錄,否則會報錯,
此配置文件指定的目錄為/data/app/hadoop-2.7.1/tmp/,因此需要先創建目錄
mkdir? /data/app/hadoop-2.7.1/tmp/
格式化NameNode
hdfs namenode -format
===>?將 tmp 目錄下的 dfs 目錄拷貝到 bigdata2 中相同的目錄下
scp -r /data/app/hadoop-2.7.1/tmp/dfs? bigdata2:/data/app/hadoop-2.7.1/tmp
===>?格式化 zookeeper(bigdata1):
需啟動 zookeeper 才能執行成功,否則會提示:WARN zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: 拒絕連接
zkServer.sh? start??(在 bigdata1,bigdata2,bigdata3上啟動,即,zookeeper 集群所在的機器)
hdfs zkfc -formatZK
===>?至此,環境部署完畢,啟動整個集群環境:
1. 啟動 zookeeper(bigdata1,bigdata2,bigdata3):
(若不先啟動zookeeper,namenode會全部為standby 狀態)?
zkServer.sh? start
2. 啟動 hdfs 集群:
start-all.sh (在bigdata1上啟動)
yarn-daemon.sh? start? resourcemanager? ?(在 bigdata2 上啟動)
===>?各主機執行 jps 狀態:
##############################################################
[root@bigdata1 app]# jps
22224 JournalNode
22400 DFSZKFailoverController
22786 Jps
22019 NameNode
21405 QuorumPeerMain
22493 ResourceManager
##############################################################
[root@bigdata2 app]# jps
9408 QuorumPeerMain
9747 DFSZKFailoverController
9637 JournalNode
9929 Jps
9850 ResourceManager
9565 NameNode
##############################################################
[root@bigdata3 app]# jps
7664 DataNode
7531 QuorumPeerMain
7900 Jps
7775 NodeManager
##############################################################
[root@bigdata4 ~]# jps
7698 NodeManager
7587 DataNode
7823 Jps
##############################################################
測試:訪問 50070 端口網頁,其中有顯示namenode 的狀態信息(active/ standby)
可以kill 掉 activ 機器的 NameNode 進程,然后查看另一臺 NameNode 的狀態信息