溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

hadoop的HA

發(fā)布時間:2020-06-21 01:06:32 來源:網(wǎng)絡(luò) 閱讀:345 作者:原生zzy 欄目:大數(shù)據(jù)

1. 為什么要搭建HA?

??在hadoop2.x之前,在HDFS 集群中NameNode 存在單點故障 (SPOF:A Single Point of Failure)。對于只有一個 NameNode 的集群,如果 NameNode 機(jī)器出現(xiàn)故障(比如宕機(jī)或是軟件、硬件升級),那么整個集群將無法使用,必須等到 NameNode 重新啟動,之后才能對外提供服務(wù),這個方式在生成環(huán)境中是絕對不允許出現(xiàn)的。
??HDFS 的 HA:通過配置 Active/Standby 兩個 NameNodes 實現(xiàn)在集群中對 NameNode 的熱備來解決上述問題。如果出現(xiàn)故障,如機(jī)器崩潰或機(jī)器需要升級維護(hù),這時可通過此種方式將 NameNode 很快的切換到另外一臺機(jī)器。

2. HA的工作原理?

hadoop的HA
解釋(數(shù)據(jù)一致以及持久化問題):

  • 當(dāng)hdfs客戶端連接namenode時,namenode啟動時,會向JN集群提交edtis log(操作記錄日志)。
  • 此時在JN集群中,當(dāng)有一半的集群服務(wù)成功的接收到了消息,然后返回給namenode,這就表示edits log上傳成功。
  • 此時NameNode(standBy),需要從JN集群取回元數(shù)據(jù)信息,然后整合新的fsimage,然后推送回NameNode(active)
  • 在NameNode(standBy)向JN索要數(shù)據(jù)的時候,首先在JN中會查看是否有宕機(jī)的機(jī)器,采用過半機(jī)制(當(dāng)集群中有部分服務(wù)器宕機(jī)時,此時集群會將大部分可以使用的機(jī)器作為主,其他的機(jī)器全部停止服務(wù)),去向備機(jī)(standBy)提供對外的數(shù)據(jù)傳輸。
  • 在解決block 塊信息時,此時datanode會向兩臺namenode都發(fā)送block 塊信息。
    解釋(解決主備切換問題):
  • 此時需要使用到另外一個集群zookeeper,zookeeper集群是一個高可用的集群,它的實現(xiàn)機(jī)制是,首先是一個服務(wù)器提供對外的服務(wù),其他的機(jī)器是備機(jī),當(dāng)主機(jī)壞了的時候,此時zookeeper集群中采取投票機(jī)制(邏輯時鐘,ID號,以及數(shù)據(jù)的更新程度),選出新的主。
  • 此時ZKFC務(wù)控制線程一直手抓住了zookeeper集群,另一只手抓住了NameNode。
    • 抓住NameNode(active)的服務(wù)控制,監(jiān)控NameNode(active)的狀態(tài),實時的向zookeeper集群匯報。
    • 住NameNode(standBy)的服務(wù)控制,接收zookeeper集群發(fā)送的信息,如果發(fā)送過來的信息,表示主NameNode已停止服務(wù),立刻調(diào)用服務(wù)控制中的回調(diào)函數(shù),讓NameNode(standBy)變成主機(jī)繼續(xù)提供服務(wù)。
  • ? 以上的作用是一個和keeplive相同的作用,使用zookeeper不同之處在于,如果服務(wù)控制處出現(xiàn)進(jìn)程的異常退出時,此時通過zookeeper集群會將備機(jī)改為active狀態(tài),此時主機(jī)可能還是active,就造成了兩臺active的NameNode。在zookeeper中是這樣解決的:當(dāng)有一個服務(wù)控制進(jìn)程異常退出后,他會有一只無形的手去連接另外一臺NameNode,并且在可控的范圍內(nèi),將其變成主(active),而將自己無法控制的那臺NameNode,變成備機(jī)。

    3. HA的集群搭建?

    搭建集群前的準(zhǔn)備:https://blog.51cto.com/14048416/2341450
    zookeeper集群的搭建:https://blog.51cto.com/14048416/2336178

    1)集群的規(guī)劃

    hadoop的HA

    2)具體安裝步驟:

    1)上傳安裝包 hadoop-2.6.5-centos-6.7.tar.gz
    2)解壓到對應(yīng)的安裝目錄

    [hadoop@hadoop01 ~]$tar -zxvf hadoop-2.6.5-centos-6.7.tar.gz -C /home/hadoop/apps/

    3)修改配置文件

    hadoo-env.sh:
    加入:export JAVA_HOME= /usr/local/jdk1.8.0_73

core-site.xml

<configuration>
<!-- 指定 hdfs 的 nameservice 為 myha01 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://myha01/</value>
</property>
<!-- 指定 hadoop 工作目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property>
<!-- 指定 zookeeper 集群訪問地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>

hdfs-site.xml

<configuration>
<!-- 指定副本數(shù) -->
<property>
 <name>dfs.replication</name>
 <value>3</value>
</property>
<!--指定 hdfs 的 nameservice 為 myha01,需要和 core-site.xml 中保持一致-->
<property>
 <name>dfs.nameservices</name>
 <value>myha01</value>
</property>
<!-- myha01 下面有兩個 NameNode,分別是 nn1,nn2 -->
<property>
 <name>dfs.ha.namenodes.myha01</name>
 <value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property>
 <name>dfs.namenode.rpc-address.myha01.nn1</name>
 <value>hadoop01:9000</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
 <name>dfs.namenode.http-address.myha01.nn1</name>
 <value>hadoop01:50070</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
 <name>dfs.namenode.rpc-address.myha01.nn2</name>
 <value>hadoop02:9000</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
 <name>dfs.namenode.http-address.myha01.nn2</name>
 <value>hadoop02:50070</value>
</property>
<!-- 指定 NameNode 的 edits 元數(shù)據(jù)在 JournalNode 上的存放位置 -->
<property>
 <name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/myha01</value>
</property>
<!-- 指定 JournalNode 在本地磁盤存放數(shù)據(jù)的位置 -->
<property>
 <name>dfs.journalnode.edits.dir</name>
 <value>/home/hadoop/data/journaldata</value>
</property>
<!-- 開啟 NameNode 失敗自動切換 -->
<property>
 <name>dfs.ha.automatic-failover.enabled</name>
 <value>true</value>
</property>
<!-- 配置失敗自動切換實現(xiàn)方式 -->
<!-- 此處配置在安裝的時候切記檢查不要換行-->
<property>
 <name>dfs.client.failover.proxy.provider.myha01</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverPr
oxyProvider</value>
</property>
<!-- 配置隔離機(jī)制方法,多個機(jī)制用換行分割,即每個機(jī)制暫用一行-->
<property>
 <name>dfs.ha.fencing.methods</name>
 <value>
 sshfence
 shell(/bin/true)
 </value>
</property>
<!-- 使用 sshfence 隔離機(jī)制時需要 ssh 免登陸 -->
<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔離機(jī)制超時時間 -->
<property>
 <name>dfs.ha.fencing.ssh.connect-timeout</name>
 <value>30000</value>
</property>
</configuration>

mapred-site.xml

<configuration>
<!-- 指定 mr 框架為 yarn 方式 -->
<property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
</property>
<!-- 設(shè)置 mapreduce 的歷史服務(wù)器地址和端口號 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- mapreduce 歷史服務(wù)器的 web 訪問地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>
</configuration>

yarn-site.xml

<configuration>
<!-- 開啟 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>hadoop01</value>
</property>
<property>
 <name>yarn.resourcemanager.hostname.rm2</name>
 <value>hadoop02</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
 <name>yarn.resourcemanager.zk-address</name>
 <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 要運行 MapReduce 程序必須配置的附屬服務(wù) -->
<property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
</property>
<!-- 開啟 YARN 集群的日志聚合功能 -->
<property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>
<!-- YARN 集群的聚合日志最長保留時長 -->
<property>
 <name>yarn.log-aggregation.retain-seconds</name>
 <value>86400</value>
</property>
<!-- 啟用自動恢復(fù) -->
<property>
 <name>yarn.resourcemanager.recovery.enabled</name>
 <value>true</value>
</property>
<!-- 制定 resourcemanager 的狀態(tài)信息存儲在 zookeeper 集群上-->
<property>
 <name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>

slaves

hadoop01
hadoop02
hadoop03
4)分發(fā)安裝包到其他機(jī)器

[hadoop@hadoop01 apps]$scp -r hadoop-2.6.5 hadoop@hadoop02:$PWD
[hadoop@hadoop01 apps]$scp -r hadoop-2.6.5 hadoop@hadoop03:$PWD

5)分別配置環(huán)境變量

[hadoop@hadoop01 apps]$ vi ~/.bashrc
添加兩行:

export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

[hadoop@hadoop01 apps]$ source ~/.bashrc

6)集群初始化操作

先啟動 zookeeper 集群
啟動:zkServer.sh start
檢查啟動是否正常:zkServer.sh status
啟動 journalnode 進(jìn)程
[hadoop@hadoop01 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop02 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop03 ~]$ hadoop-daemon.sh start journalnode
然后用 jps 命令查看是否各個 datanode 節(jié)點上都啟動了 journalnode 進(jìn)程
在第一個 namenode 上執(zhí)行格式化操作
[hadoop@hadoop01 ~]$ hadoop namenode -format
hadoop的HA
然后會在 core-site.xml 中配置的臨時目錄中生成一些集群的信息把他拷貝的第二個 namenode 的相同目錄下
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
兩個 namenode 節(jié)點該目錄中的數(shù)據(jù)結(jié)構(gòu)是一致的
[hadoop@hadoop01 ~]$ scp -r ~/data/hadoopdata/ hadoop03:~/data
或者在另一個namenode節(jié)點上使用:hadoop namenode -bootstrapStandby
格式化 ZKFC(在一臺集群上格式化即可):
[hadoop@hadoop01 ~]$ hdfs zkfc -formatZK
啟動 HDFS
[hadoop@hadoop01 ~]$ start-dfs.sh
啟動 YARN
[hadoop@hadoop01 ~]$ start-yarn.sh
若備用節(jié)點的 resourcemanager 沒有啟動起來,則手動啟動起來:
[hadoop@hadoop02 ~]$ yarn-daemon.sh start resourcemanager

7)補充:

查看各主節(jié)點的狀態(tài)
HDFS:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

YARN:
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2

4. HA的集群搭建后測試

1.手動殺死active的namenode,看看集群的狀況
2.手動殺死active的resourcemanager,看看集群的狀況
3.在上傳文件時,殺死namenode,查看集群狀況
4.在執(zhí)行任務(wù)時,殺死resourcemanager,查看集群狀態(tài)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI