如何搭建Hadoop-HA(高可用)模式?
- 前置條件
- 集群架構設計
- 修改組態檔
- 第一步
- 第二步
- 第三步
- 分發組態檔
- 格式化
- 第一步
- 第二步
- 第三步
- 啟動集群
- 啟動zookeeper
- 啟動JournalNode
- start-all
- 啟動備用節點上的RM
- zkfc未啟動的情況
- (可選)啟動JobHistory
前置條件
我們需要一個Hadoop集群(至少三臺虛擬機),并且配置好zookeeper,如果這兩個要求還沒有做到或者有疑問,請移步到我的另外兩篇博文,都有詳細教程:
Hadoop的安裝、配置、初步使用!(附加集群)
于Hadoop集群上進行的zookeeper配置、時間同步
集群架構設計
| 主機名 | IP | NameNode | ResourceManage | zkfc | DataNode | NodeManager | Journalnode | zookeeper | JobHistory |
|---|---|---|---|---|---|---|---|---|---|
| HadoopX | 192.168.23.200 | √ | √ | √ | √ | √ | √ | √ | |
| HadoopX1 | 192.168.23.201 | √ | √ | √ | √ | √ | √ | √ | |
| HadoopX2 | 192.168.23.202 | √ | √ | √ | √ | √ |
修改組態檔
以下修改組態檔的操作均只在HadoopX(主節點)上先行操作
第一步
修改core-site.xml檔案
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>HadoopX:2181,HadoopX1:2181,HadoopX2:2181</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
第二步
修改hdfs-site.xml檔案
<configuration>
<!--指定hdfs的nameservice為ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有兩個NameNode,分別是HadoopX,HadoopX1 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>HadoopX,HadoopX1</value>
</property>
<!-- HadoopX的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.HadoopX</name>
<value>HadoopX:9000</value>
</property>
<!-- HadoopX的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.HadoopX</name>
<value>HadoopX:50070</value>
</property>
<!-- HadoopX1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.HadoopX1</name>
<value>HadoopX1:9000</value>
</property>
<!-- HadoopX1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.HadoopX1</name>
<value>HadoopX1:50070</value>
</property>
<!-- 指定NameNode的元資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://HadoopX:8485;HadoopX1:8485;HadoopX2:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盤存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/tmp/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
shell(/bin/true)
</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
另外,在HA模式下節點數可以不配置
<!-- 節點數,ha中可不配置 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
原本的secondary namenode則需要注釋或洗掉
<!--當使用HA配置集群,則不需要secondary namenode
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.23.50:50090</value>
</property>
-->
第三步
mapred-site.xml檔案不用修改
修改yarn-site.xml檔案
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 開啟RM高可用 --> <!-- RM 代指 resource manager -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster_id</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>HadoopX</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>HadoopX1</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>HadoopX:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>HadoopX1:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>HadoopX:2181,HadoopX1:2181,HadoopX2:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
原本配置的RM這里要洗掉或注釋
<!--非HA模式下指定resourcemanager
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>-->
原本這里的配置可以保留,目前沒發現會產生Fatal Error
在啟動JobHistory服務時查看日志檔案,里面會有Error但是不影響
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
分發組態檔
如果之后發現剛才的組態檔有地方報錯或者還需要修改,并且已經在其他機器上生效,請在重新修改后,直接回傳到這一步來繼續操作!!!
由于剛才我們只在HadoopX(主節點)上修改了配置,現在要把修改好的組態檔傳給其他集群內的虛擬機
# 可以去到這些組態檔的所在目錄下
cd /opt/hadoop/etc/hadoop
scp core-site.xml HadoopX1:$PWD
scp hdfs-site.xml HadoopX1:$PWD
scp yarn-site.xml HadoopX1:$PWD
scp core-site.xml HadoopX2:$PWD
scp hdfs-site.xml HadoopX2:$PWD
scp yarn-site.xml HadoopX2:$PWD
# 或者使用絕對路徑
scp /opt/hadoop/etc/hadoop/core-site.xml HadoopX1:$PWD
...
格式化
第一步
首先停用所有的服務stop-all.sh
然后來到/opt/hadoop目錄下
洗掉logs和tmp目錄rm -rf logs/ rm -rf tmp/
以上操作在所有虛擬機上都要完成
第二步
然后只在主節點上格式化hadoop namenode -format
報錯案例一:

組態檔有問題,請仔細閱讀紅色ERROR后的報錯資訊,然后回去修改,記得重新發給其他虛擬機
報錯案例二:

如果遇到這種情況,請先啟動JournalNodehadoop-daemons.sh start journalnode,再進行格式化;目前博主學資尚淺,無法解釋其中原因,如果有知道的還請在評論區留言!
第三步
復制主節點的tmp檔案夾到HadoopX1上(這里的HadoopX1為我個人的“備用”節點,參考開頭的集群結構設計)
scp -r tmp Hadoop1:$PWD

啟動集群
這里的操作具體請參考我寫在開頭的集群結構設計,情況因人而異,請務必不要完全照搬!
啟動zookeeper
所有虛擬機均需要
/opt/zk/bin/zkServer.sh start
啟動JournalNode
所有虛擬機均需要(如果在格式化前已經啟動過,則跳過這一步)
hadoop-daemons.sh start journalnode
start-all
在主節點上啟動start-all.sh,啟動后用jps查看是否有服務未能啟動成功
錯誤案例:

這里的Namenode就沒有啟動,我們可以去日志檔案里查看具體報錯資訊,記得將.out換成.log后綴

啟動備用節點上的RM
在HadoopX1上啟動resource manager
yarn-daemon.sh start resourcemanager
zkfc未啟動的情況
這是在我的主節點上的服務:

有人可能會觀察到zkfc服務沒有啟動,對此我們需要如下兩步來啟動它:
1.主節點上格式化zkfc
hdfs zkfc -formatZK
2.主、備節點啟動zkfc
hadoop-daemon.sh start zkfc
這樣主節點所有所需的服務都開啟了:

(可選)啟動JobHistory
因為我在之前的配置里將JobHistory的設定在第三臺虛擬機(HadoopX2)上,所以先去那里啟動一下
mr-jobhistory-daemon.sh start historyserver
如果在一段時間(大約一到兩分鐘)后JobHistory服務仍然存在,則說明歷史服務啟動成功!

如果JobHistory服務沒有顯示,請去日志檔案vi /opt/hadoop/logs/mapred-root-historyserver-HadoopX2.log里查看具體原因
目前個人已知的錯誤情況,大部分是因為組態檔仍然有小問題,而導致無法啟動;也有少數情況是因為埠被占用,如果是這樣請試著換一臺虛擬機開啟歷史服務;還有沒總結到的報錯請在評論區留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/1382.html
標籤:其他
