三節點高可用叢集搭建——Hadoop-HA+zookeeper
-
目錄
配置環境變數,重新整理(master、slave1、slave2都配置一下環境變數)
拷貝jdk、zookeeper到slave1和slave2節點
修改JAVA_HOME 在hadoop-env.sh yarn-env.sh mapred-env.sh 中
-
HDFS -HA模式的工作機制示意圖
說明:
1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元資料資訊,一條資料只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode
這裡還配置了一個zookeeper叢集,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為active狀態.
2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
-
叢集規劃——三節點高可用
主機名 |
IP |
安裝軟體 |
執行程序 |
master |
192.168.8.101 |
jdk、hadoop、zookeeper |
NameNode、DFSZKFailoverController(zkfc) ResourceManager DataNode、NodeManager JournalNode、QuorumPeerMain |
slave1 |
192.168.8.102 |
jdk、hadoop、zookeeper |
NameNode、DFSZKFailoverController(zkfc) ResourceManager DataNode、NodeManager JournalNode、QuorumPeerMain |
slave2 |
192.168.8.103 |
jdk、hadoop、zookeeper |
DataNode、NodeManager JournalNode、QuorumPeerMain |
-
Hadoop HA叢集搭建
配置環境變數,重新整理(master、slave1、slave2都配置一下環境變數)
export JAVA_HOME=/opt/software/jdk1.8.0_162
export HADOOP_HOME=/opt/software/hadoop-2.7.3
export ZOOKEEPER_HOME=/opt/software/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
安裝zookeeper叢集
server.ID=host:port:port ID就是myid檔案中配置的數字。下面會有介紹 第一個埠( port )是從( follower )機器連線到主( leader )機器的埠, 第二個埠是用來進行 leader 選舉的埠。 每臺機器使用三個埠,分別是: clientPort ,2181 ; port , 2888 ; port , 3888 。 |
配置檔案
cd /opt/software/zookeeper-3.4.6/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
dataDir=/opt/software/zookeeper-3.4.6/zkData
dataLogDir=/opt/software/zookeeper-3.4.6/logs
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
mkdir /opt/software/zookeeper-3.4.6/zkData
mkdir /opt/software/zookeeper-3.4.6/logs
echo 1 > /opt/software/zookeeper-3.4.6/zkData/my
-
拷貝檔案
-
拷貝jdk、zookeeper到slave1和slave2節點
-
scp -r jdk1.8.0_162/ slave1:$PWD
scp -r zookeeper-3.4.6/ slave1:$PWD
scp -r jdk1.8.0_162/ slave2:$PWD
scp -r zookeeper-3.4.6/ slave2:$PWD
-
-
-
-
修改02和03節點的myid
-
-
-
slave1:echo 2 > /opt/software/zookeeper-3.4.6/zkData/myid
cat myid
slave2:echo 3 > /opt/software/zookeeper-3.4.6/zkData/myid
cat myid
cd /opt/software/hadoop-2.7.3/etc/hadoop/
-
-
-
-
修改JAVA_HOME 在hadoop-env.sh yarn-env.sh mapred-env.sh 中
-
-
-
export JAVA_HOME=/opt/software/jdk1.8.0_162
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>/opt/software/hadoop-2.7.3-HA/tmpData</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>
mkdir /opt/software/hadoop-2.7.3-HA/tmpData
-
-
-
-
hdfs-site.xml
-
-
-
<!--指定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>master:9000</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>slave1:50070</value>
</property>
<!-- 指定NameNode的元資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/hdpdata/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--zkfc 配置失敗自動切換實現方式-->
<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>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
mkdir -p /root/hdpdata/journaldata
-
-
-
-
mapred-site.xml
-
-
-
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
-
-
-
-
yarn-site.xml
-
-
-
<configuration>
<!-- 開啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- ha.id的配置,rm1和rm2不一樣,且其他slaves不用配 -->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</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>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!-- 指定zk叢集地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
-
-
-
-
slaves
-
-
-
master
slave1
slave2
-
-
-
拷貝檔案到其他節點
-
刪除hadoop目錄中share目錄下的doc文件
-
-
-
cd /opt/software/hadoop-2.7.3-HA/share/
rm -rf doc/
-
-
-
-
設定免密
-
-
-
首先要配置master、slave1、slave2的免密碼登陸。
#在hadoop01上生產一對鑰匙:ssh-keygen -t rsa
#將公鑰拷貝到其他節點,包括自己
ssh-coyp-id master
ssh-coyp-id slave1
ssh-coyp-id slave2
#注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置slave1到master的免登陸
在slave1上生產一對鑰匙:
ssh-keygen -t rsa
ssh-coyp-id -i slave1
-
-
-
-
將配置好的hadoop拷貝到其他節點
-
-
-
scp -r hadoop-2.7.3-HA/ slave1:$PWD
scp -r hadoop-2.7.3-HA/ slave2:$PWD
-
-
-
- 測試Hadoop是否安裝成功
-
-
[[email protected]]# hadoop version
[[email protected] opt]# hadoop version
[[email protected] opt]# hadoop version
顯示對用版本就成功了!
使用date命令
date -s "2017-4-14 10:16:00"
在單點故障HDFS叢集的基礎上建立
分別在master、slave1、slave2上執行:zkServer.sh start
檢視各節點的狀態(一個leader,兩個follower):zkServer.sh status
分別在master、slave1、slave2上執行:hadoop-daemon.sh start journalnode
執行jps命令檢驗,master、slave1、slave2上多了JournalNode程序
在master上執行命令:hdfs namenode -format
格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/opt/software/hadoop-2.7.3-HA/tmpData,然後將/opt/software/hadoop-2.7.3-HA/tmpData/拷貝到slave1的/opt/software/hadoop-2.7.3-HA/tmpData下:scp -r dfs/ slave1:$PWD
master執行:hdfs zkfc -formatZK
master執行:start-dfs.sh
master執行:start-yarn.sh
在slave1上啟動resourcemanager: yarn-daemon.sh start resourcemanager
-
-
-
-
jps檢視程序
-
-
-
-
-
-
-
檢視網頁
-
-
-
可以看到剛開始我們的HDFS上面是什麼都沒有的。
-
-
測試
-
-
上傳檔案到HDFS
-
-
-
上傳一個檔案到hdfs:hadoop fs /root/wc.txt /
新建資料夾在hdfs上:
開始上傳:
-
-
-
-
驗證HA模式
-
-
-
到web頁面檢視檔案以及namenode狀態,然後kill掉為active的namenode,到另一個namenode頁面上檢視資料以及namenode狀態,當namenode狀態由standby變為active,也能檢視資料,則安裝叢集成功。
再次啟動被kill掉的namenode,到web頁面檢視,namenode狀態變為standby。
殺死namenode程序
Node1網頁無法連線
重啟namenode程序
殺死namenode上的ZKFC
Node1和node2切換主從關係
-
-
關閉叢集:
-
關閉Hadoop叢集stop-all.sh
關閉zookeeper叢集zkServer.sh stop
-
-
-
-
二次啟動
-
-
-