概覽
1.集羣規劃
2.準備
3.修改Hadoop配置文件
4.複製內容
5.啓動集羣
6.查看jps
7.測試
1.集羣規劃
HDFS HA背景
HDFS集羣中NameNode 存在單點故障(SPOF)。對於只有一個NameNode的集羣,如果NameNode機器出現意外情況,將導致整個集羣無法使用,直到NameNode 重新啓動。
影響HDFS集羣不可用主要包括以下兩種情況:一是NameNode機器宕機,將導致集羣不可用,重啓NameNode之後纔可使用;二是計劃內的NameNode節點軟件或硬件升級,導致集羣在短時間內不可用。
爲了解決上述問題,Hadoop給出了HDFS的高可用HA方案:HDFS通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,比如處理來自客戶端的RPC請求,而Standby NameNode則不對外提供服務,僅同步Active NameNode的狀態,以便能夠在它失敗時快速進行切換。
規劃
之後的服務啓動和配置文件都是安裝此配置來,master上是namenode,slave2上是yarn,而slave1則是namenode和yarn的備用
主機名 | IP | Namenode | DataNode | Yarn | Zookeeper | JournalNode |
---|---|---|---|---|---|---|
master | 192.168.134.154 | 是 | 是 | 否 | 是 | 是 |
slave1 | 192.168.134.155 | 是 | 是 | 是 | 是 | 是 |
slave2 | 192.168.134.156 | 否 | 是 | 是 | 是 | 是 |
需要說明以下幾點:
HDFS HA通常由兩個NameNode組成,一個處於Active狀態,另一個處於Standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步Active NameNode的狀態,以便能夠在它失敗時快速進行切換。
Hadoop 2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裏我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認爲寫入成功。通常配置奇數個JournalNode,這裏還配置了一個Zookeeper集羣,用於ZKFC故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode爲Active狀態。
YARN的ResourceManager也存在單點故障問題,這個問題在hadoop-2.4.1得到了解決:有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調。
YARN框架下的MapReduce可以開啓JobHistoryServer來記錄歷史任務信息,否則只能查看當前正在執行的任務信息。
Zookeeper的作用是負責HDFS中NameNode主備節點的選舉,和YARN框架下ResourceManaer主備節點的選舉。
2.準備
軟件:
1.jdk1.8.141
2.hadoop2.7.3(jdk1.8版本編譯)
3.Zookeeper3.4.12
4.Xshell5 + Xftp5
1.設置靜態ip,參考Hadoop集羣單機版的設置靜態ip,然後使用Xshell工具連接(官網有免費版本)
2.配置jdk,hosts文件
jdk安裝參考Hadoop集羣單機版的jdk安裝
[root@master bin]# vi /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 上面的給註釋掉或者刪除
192.168.134.154 master
192.168.134.155 slave1
192.168.134.156 slave2
3.配置ssh免密登錄,參考Hadoop集羣搭建的ssh免密登錄
4.配置Zookeeper,參考Zookeeper的安裝
3.修改Hadoop配置文件
如果你之前搭建過hadoop集羣,只需要將其中的配置文件做修改即可
1.在/usr下創建個hadoop文件夾,作爲hadoop安裝(壓縮)包的存放路徑和解壓路徑
#進入usr文件夾下
cd /usr
#創建hadoop文件夾
mkdir hadoop
#進入hadoop文件夾
cd hadoop
利用Xftp工具將文件傳輸到虛擬機中
解壓後進入到 hadoop的解壓路徑/etc/hadoop文件夾下
cd /usr/hadoop/hadoop-2.7.3/etc/hadoop/
3.1.core-site.xml
vim core-site.xml
在其中的configuration標籤中添加以下內容
<!-- 指定hdfs的nameservice爲ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop數據存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/HA/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish
a server connection.
</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for
before retrying to establish a server connection.
</description>
</property>
3.2.hdfs-site.xml
vim hdfs-site.xml
在其中的configuration標籤中添加以下內容
<!--指定hdfs的nameservice爲ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.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/ns</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/HA/hadoop/journal</value>
</property>
<!-- 開啓NameNode故障時自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///HA/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///HA/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 在NN和DN上開啓WebHDFS (REST API)功能,不是必須 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
3.3.mapred-site.xml
這個文件剛開始是沒有的,所以我們需要將其創建出來
#利用模版文件copy出來一個
cp mapred-site.xml.template mapred-site.xml
然後在其configuration標籤中添加以下內容vim mapred-site.xml
<!-- 指定mr運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.4.yarn-site.xml
vim yarn-site.xml
在其configuration標籤中添加以下內容
普通版
只有slave2有Resourcemanager
<!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave2</value>
</property>
yarn HA高可用版
slave1和slave2都有Resourcemanager
<!-- //////////////以下爲YARN HA的配置////////////// -->
<!-- 開啓YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 啓用自動故障轉移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定YARN HA的名稱 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 指定兩個resourcemanager的名稱 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主機 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!-- 配置YARN的http端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>slave2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave1:8088</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- 配置zookeeper的存儲位置 -->
<property>
<name>yarn.resourcemanager.zk-state-store.parent-path</name>
<value>/rmstore</value>
</property>
<!-- 開啓yarn resourcemanager restart -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置resourcemanager的狀態存儲到zookeeper中 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 開啓yarn nodemanager restart -->
<property>
<name>yarn.nodemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置nodemanager IPC的通信端口 -->
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
3.5 .hadoop-env.sh
export JAVA_HOME=${JAVA_HOME} 一行,
將其修改爲 export JAVA_HOME=/usr/java/jdkxxx(jdk的安裝路徑)
3.6.修改slaves文件(dataNode)
修改爲
#localhost
#你的集羣主機名
master
slave1
slave2
4.複製內容到slave1,slave2
如果你的slave1和slave2什麼也沒有,可以一併將配置jdk的profile文件和配置ip映射的hosts文件一起復制過去,Zookeeper則需要注意改下配置文件
#複製給slave1,如果之前有hadoop也會覆蓋
[root@master hadoop]# scp -r /usr/hadoop root@slave1:/usr/
#複製給slave2
[root@master hadoop]# scp -r /usr/hadoop root@slave2:/usr/
5.啓動集羣
5.1分別啓動Zookeeper
所有虛擬機全部啓動
在Zookeeper安裝目錄的/bin目錄下啓動
[root@master hadoop]# cd /usr/zookeeper/zookeeper-3.4.12/bin
[root@master bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
啓動後查看狀態
[root@slave1 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: leader #leader或者follower則代表啓動Zookeeper成功
5.2在master,slave1,slave2上啓動journalnode
#進入到hadoop安裝目錄sbin文件夾下
[root@master bin]# cd /usr/hadoop/hadoop-2.7.3/sbin/
[root@master sbin]# ls
distribute-exclude.sh kms.sh start-balancer.sh stop-all.cmd stop-yarn.cmd
hadoop-daemon.sh mr-jobhistory-daemon.sh start-dfs.cmd stop-all.sh stop-yarn.sh
hadoop-daemons.sh refresh-namenodes.sh start-dfs.sh stop-balancer.sh yarn-daemon.sh
hdfs-config.cmd slaves.sh start-secure-dns.sh stop-dfs.cmd yarn-daemons.sh
hdfs-config.sh start-all.cmd start-yarn.cmd stop-dfs.sh
httpfs.sh start-all.sh start-yarn.sh stop-secure-dns.sh
#這裏有一個daemons和daemon,不帶s是啓動單個,帶s是啓動集羣
[root@master sbin]# ./hadoop-daemons.sh start journalnode
slave2: starting journalnode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-journalnode-slave2.out
slave1: starting journalnode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-journalnode-slave1.out
master: starting journalnode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-journalnode-master.out
分別在master,slave1,slave2上查看jps
#這樣正常,否則查看你的Zookeeper是否啓動成功
[root@master sbin]# jps
2232 JournalNode
2281 Jps
2157 QuorumPeerMain
5.3在master上格式化zkfc
[root@master sbin]# hdfs zkfc -formatZK
5.4在master上格式化hdfs
[root@master sbin]# hadoop namenode -format
5.5在master上啓動namenode
[root@master sbin]# ./hadoop-daemon.sh start namenode
starting namenode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-namenode-master.out
[root@master sbin]# jps
2232 JournalNode
2490 Jps
2157 QuorumPeerMain
2431 NameNode
5.6在slave1上啓動數據同步和standby的namenode
[root@slave1 sbin]# hdfs namenode -bootstrapStandby
[root@slave1 sbin]# ./hadoop-daemon.sh start namenode
5.7在master上啓動datanode
[root@master sbin]# ./hadoop-daemons.sh start datanode
master: starting datanode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-datanode-master.out
slave2: starting datanode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-datanode-slave2.out
slave1: starting datanode, logging to /usr/hadoop/hadoop-2.7.3/logs/hadoop-root-datanode-slave1.out
5.8在slave1和slave2上啓動yarn
./start-yarn.sh
5.9在master上啓動zkfc
./hadoop-daemons.sh start zkfc
6.查看jps
master
[root@master sbin]# jps
2593 DataNode
2709 NodeManager
2902 DFSZKFailoverController
2232 JournalNode
2969 Jps
2157 QuorumPeerMain
2431 NameNode
slave1
[root@slave1 sbin]# jps
2337 QuorumPeerMain
3074 Jps
2259 JournalNode
2709 ResourceManager
2475 NameNode
2587 DataNode
3007 DFSZKFailoverController
slave2
[root@slave2 sbin]# jps
2355 DataNode
2164 JournalNode
2244 QuorumPeerMain
3126 NodeManager
3017 ResourceManager
3162 Jps
啓動如上則正常
如果有服務沒有啓動,重啓該服務,例如Resourcemanager沒啓動
#停止
./stop-yarn.sh
#啓動
./start-yarn.sh
然後在50070和8088端口進行測試
在測試之前爲了防止namenode不能熱切換,最好安裝此插件
在master和slave1上安裝
yum -y install psmisc
- 1
7.測試
在(master的ip)192.168.134.154:50070和(slave1的ip)192.168.134.155:50070上查看namenode的狀態
都能訪問且一個是active一個是standby狀態
然後訪問(slave1)192.168.134.155:8088和(slave2)192.168.134.156:8088查看Resourcemanager狀態
若是一個能訪問,訪問另一個時跳到前一個的時候並不是錯誤,那樣是正常的
能訪問的那個是active狀態,若是兩個都能訪問則一個是active一個是standby
首先在master主機上想hdfs上傳一個文件,然後嘗試能否在slave1和slave2上查看
[root@master tmp]# cd /usr/tmp
[root@master tmp]# touch test
[root@master tmp]# hadoop fs -put test /
#分別在三臺虛擬機上查看
[root@master tmp]# hadoop fs -ls /
Found 1 items
-rw-r--r-- 3 root supergroup 0 2018-10-22 20:42 /test
如果都能查看到,接下來再測試是否能夠熱切換
#查看進程
[root@master tmp]# jps
2593 DataNode
2902 DFSZKFailoverController
2232 JournalNode
3609 NodeManager
2157 QuorumPeerMain
2431 NameNode
3807 Jps
#殺死active的namenode
[root@master tmp]# kill -9 2431
在網頁查看standby的是否變爲active
從standby成功變更爲active則表示成功
同樣,測試yarn HA高可用
#查看進程
[root@slave2 sbin]# jps
4050 Jps
2355 DataNode
2164 JournalNode
2244 QuorumPeerMain
3423 ResourceManager
3919 NodeManager
#殺死active的ResourceManager
[root@slave2 sbin]# kill -9 3423
在網頁查看
如果說你殺死了namenode進程,那麼相應的50070端口則無法訪問了,同理8088端口一樣
至此hadoop HA高可用版搭建完成.
接下來會說一下hive的安裝和使用