Hadoop HA(高可用搭建)


上次記錄了hadoop完全分布式搭建(非高可用),這次來學習hadoop HA 搭建。

一、原理機制

主備NameNode
解決單點故障(屬性,位置)

  • 主NameNode對外提供服務,備NameNode同步主NameNode元數據,以待切換
  • 所有DataNode同時向兩個NameNode匯報數據塊信息(位置)
  • JNN:集群(屬性)
  • standby:備,完成了edits.log文件的合並產生新的image,推送回ANN

兩種切換選擇

  • 手動切換:通過命令實現主備之間的切換,可以用HDFS升級等場合
  • 自動切換:基於Zookeeper實現

基於Zookeeper自動切換方案

  • ZooKeeper Failover Controller:監控NameNode健康狀態,
  • 並向Zookeeper注冊NameNode
  • NameNode掛掉后,ZKFC為NameNode競爭鎖,獲得ZKFC 鎖的NameNode變為active

二、步驟

集群規划

NN-1 NN-2 DN ZK ZKFC JNN
node01 * * *
node02 * * * * *
node03 * * *
node04 * *

1.修改hadoop.ev.sh文件

(hadoop3.x中要求指定用戶進程)

export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root

2.配置hdfs-site.xml

(這里配置有點多,查看官方文檔介紹:hadoop-3.2.0 doc HDFSHighAvailabilityWithQJM

dfs.nameservices - the logical name for this new nameservice

(名稱服務,只是一個邏輯名稱邏輯名稱)

<!--為這個nameservice選擇一個邏輯名稱,例如“mycluster”,並為這個配置選項的值使用這個邏輯名稱。您選擇的名稱是任意的。它將用於配置並作為集群中絕對HDFS路徑的權威組件。-->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice

(名稱服務中每個NameNode的惟一標識符)

<!--使用逗號分隔的NameNode id列表進行配置。datanode將使用它來確定集群中的所有namenode。例如,本文使用“mycluster”作為nameservice ID,並且我們集群規划使用“node01”、“node02”作為namenode的單獨ID,可以這樣配置:-->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>node01,node02</value>
</property>
<!--官網建議:HA的最小namenode數量是兩個,但是您可以配置更多。由於通信開銷,建議不超過5個(建議使用3個namenode)-->

dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on

(namenode的rpc服務器的監聽地址)

<property>
  <name>dfs.namenode.rpc-address.mycluster.node01</name>
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.node02</name>
  <value>node02:8020</value>
</property>

dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on

(namenode的HTTP服務器的監聽地址,與rpc同理只不過端口變為9870)

<property>
  <name>dfs.namenode.http-address.mycluster.node01</name>
  <value>node01:9870</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.node02</name>
  <value>node02:9870</value>
</property>

dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits

(配置JournalNodes 集群的URI)

<!--這是配置提供共享編輯存儲的journalnode地址的地方,這些地址由活動nameNode寫入,由備用nameNode讀取,以便與活動nameNode所做的所有文件系統更改保持最新。雖然必須指定幾個JournalNode地址,但是應該只配置其中一個uri。URI的形式應該是:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*。日志ID是這個名稱服務的惟一標識符,它允許一組日志節點為多個聯合名稱系統提供存儲-->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode

(配置故障轉移代理類)

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover

(隔離方法;確保當前時間點只有一個namenode處於active狀態,jurnalnode只允許1個namenode來讀寫數據,但是也會出現意外的情況,因此需要控制對方機器,進行將自我提升[active],將對方降級[standby])

<property>
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
</property>

<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state

(journalnode日志存放路徑)

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/tmp/hadoop/journalnode/data</value>
</property>

3.core-site.xml

(注意更改下 hadoop.tmp.dir 的路徑,與node的名稱【類似一個域名多ip】)

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/tmp/hadoop/ha</value>
        </property>
</configuration>

4.自動故障轉移配置【zk】

再次回到hdfs-site.xml文件與core-site.xml配置中:

打開自動故障轉移:

The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml file, add:

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

添加zookeeper的地址:

This specifies that the cluster should be set up for automatic failover. In your core-site.xml file, add:

<property>
    <name>ha.zookeeper.quorum</name>
    <value>node02:2181,node03:2181,node04:2181</value>
</property>

5.分發配置到其他節點

注意workes也要配置

scp -r hadoop-env.sh core-site.xml hdfs-site.xml node04:`pwd`

6.安裝Zookeeper及配置

安裝:略

配置zoo.cfg:

dataDir=/opt/tmp/zookeeper

server.1=192.168.121.102:2888:3888
server.2=192.168.121.103:2888:3888
server.3=192.168.121.104:2888:3888

創建myid【1 2 3同理】:

mkdir /opt/tmp/zookeeper
echo 1 > /opt/tmp/zookeeper/myid

7.啟動Hadoop HA

  1. 啟動zookeeper集群

    zkServer.sh start
    
  2. 啟動jurnalnode集群

    hadoop-daemon.sh start journalnode
    或者 hdfs --daemon start journalnode
    
  3. 啟動第一台namenode

    hdfs namenode -format
    hadoop-deamon.sh start namenode
    或者 hdfs --daemon start namenode
    
  4. 剩余namenode啟動做備

    hdfs namenode  -bootstrapStandby
    
  5. 啟動datanode等節點

    start-dfs.sh
    
  6. Initializing HA state in ZooKeeper(在ZooKeeper中初始化HA狀態)

    hdfs zkfc -formatZK
    

三、測試

訪問node01:9870: Overview 'node02:8020' (active)

訪問node02:9870: Overview 'node02:8020' (standby)

1.namenode掛掉的情況

hadoop-daemon.sh stop namenode 或者
hdfs --daemon stop namenode

2.ZKFC掛掉的情況

hadoop-daemon.sh stop zkfc 或者
hdfs --daemon stop zkfc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM