成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Hadoop系列(八)——基于ZooKeeper搭建Hadoop高可用集群

一、高可用簡(jiǎn)介

Hadoop 高可用 (High Availability) 分為 HDFS 高可用和 YARN 高可用,兩者的實(shí)現(xiàn)基本類似,但 HDFS NameNode 對(duì)數(shù)據(jù)存儲(chǔ)及其一致性的要求比 YARN ResourceManger 高得多,所以它的實(shí)現(xiàn)也更加復(fù)雜,故下面先進(jìn)行講解:

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供名山網(wǎng)站建設(shè)、名山做網(wǎng)站、名山網(wǎng)站設(shè)計(jì)、名山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、名山企業(yè)網(wǎng)站模板建站服務(wù),10余年名山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

1.1 高可用整體架構(gòu)

HDFS 高可用架構(gòu)如下:

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

圖片引用自:https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/

HDFS 高可用架構(gòu)主要由以下組件所構(gòu)成:

  • Active NameNode 和 Standby NameNode:兩臺(tái) NameNode 形成互備,一臺(tái)處于 Active 狀態(tài),為主 NameNode,另外一臺(tái)處于 Standby 狀態(tài),為備 NameNode,只有主 NameNode 才能對(duì)外提供讀寫服務(wù)。

  • 主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨(dú)立的進(jìn)程運(yùn)行,對(duì) NameNode 的主備切換進(jìn)行總體控制。ZKFailoverController 能及時(shí)檢測(cè)到 NameNode 的健康狀況,在主 NameNode 故障時(shí)借助 Zookeeper 實(shí)現(xiàn)自動(dòng)的主備選舉和切換,當(dāng)然 NameNode 目前也支持不依賴于 Zookeeper 的手動(dòng)主備切換。

  • Zookeeper 集群:為主備切換控制器提供主備選舉支持。

  • 共享存儲(chǔ)系統(tǒng):共享存儲(chǔ)系統(tǒng)是實(shí)現(xiàn) NameNode 的高可用最為關(guān)鍵的部分,共享存儲(chǔ)系統(tǒng)保存了 NameNode 在運(yùn)行過(guò)程中所產(chǎn)生的 HDFS 的元數(shù)據(jù)。主 NameNode 和 NameNode 通過(guò)共享存儲(chǔ)系統(tǒng)實(shí)現(xiàn)元數(shù)據(jù)同步。在進(jìn)行主備切換的時(shí)候,新的主 NameNode 在確認(rèn)元數(shù)據(jù)完全同步之后才能繼續(xù)對(duì)外提供服務(wù)。

  • DataNode 節(jié)點(diǎn):除了通過(guò)共享存儲(chǔ)系統(tǒng)共享 HDFS 的元數(shù)據(jù)信息之外,主 NameNode 和備 NameNode 還需要共享 HDFS 的數(shù)據(jù)塊和 DataNode 之間的映射關(guān)系。DataNode 會(huì)同時(shí)向主 NameNode 和備 NameNode 上報(bào)數(shù)據(jù)塊的位置信息。

1.2 基于 QJM 的共享存儲(chǔ)系統(tǒng)的數(shù)據(jù)同步機(jī)制分析

目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作為共享的存儲(chǔ)系統(tǒng),這里以 QJM 集群為例進(jìn)行說(shuō)明:Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再?gòu)?JournalNode 集群定時(shí)同步 EditLog,當(dāng) Active NameNode 宕機(jī)后, Standby NameNode 在確認(rèn)元數(shù)據(jù)完全同步之后就可以對(duì)外提供服務(wù)。

需要說(shuō)明的是向 JournalNode 集群寫入 EditLog 是遵循 “過(guò)半寫入則成功” 的策略,所以你至少要有 3 個(gè) JournalNode 節(jié)點(diǎn),當(dāng)然你也可以繼續(xù)增加節(jié)點(diǎn)數(shù)量,但是應(yīng)該保證節(jié)點(diǎn)總數(shù)是奇數(shù)。同時(shí)如果有 2N+1 臺(tái) JournalNode,那么根據(jù)過(guò)半寫的原則,最多可以容忍有 N 臺(tái) JournalNode 節(jié)點(diǎn)掛掉。

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

1.3 NameNode 主備切換

NameNode 實(shí)現(xiàn)主備切換的流程下圖所示:

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

  1. HealthMonitor 初始化完成之后會(huì)啟動(dòng)內(nèi)部的線程來(lái)定時(shí)調(diào)用對(duì)應(yīng) NameNode 的 HAServiceProtocol RPC 接口的方法,對(duì) NameNode 的健康狀態(tài)進(jìn)行檢測(cè)。
  2. HealthMonitor 如果檢測(cè)到 NameNode 的健康狀態(tài)發(fā)生變化,會(huì)回調(diào) ZKFailoverController 注冊(cè)的相應(yīng)方法進(jìn)行處理。
  3. 如果 ZKFailoverController 判斷需要進(jìn)行主備切換,會(huì)首先使用 ActiveStandbyElector 來(lái)進(jìn)行自動(dòng)的主備選舉。
  4. ActiveStandbyElector 與 Zookeeper 進(jìn)行交互完成自動(dòng)的主備選舉。
  5. ActiveStandbyElector 在主備選舉完成后,會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法來(lái)通知當(dāng)前的 NameNode 成為主 NameNode 或備 NameNode。
  6. ZKFailoverController 調(diào)用對(duì)應(yīng) NameNode 的 HAServiceProtocol RPC 接口的方法將 NameNode 轉(zhuǎn)換為 Active 狀態(tài)或 Standby 狀態(tài)。

1.4 YARN高可用

YARN ResourceManager 的高可用與 HDFS NameNode 的高可用類似,但是 ResourceManager 不像 NameNode ,沒(méi)有那么多的元數(shù)據(jù)信息需要維護(hù),所以它的狀態(tài)信息可以直接寫到 Zookeeper 上,并依賴 Zookeeper 來(lái)進(jìn)行主備選舉。

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

二、集群規(guī)劃

按照高可用的設(shè)計(jì)目標(biāo):需要保證至少有兩個(gè) NameNode (一主一備) 和 兩個(gè) ResourceManager (一主一備) ,同時(shí)為滿足“過(guò)半寫入則成功”的原則,需要至少要有 3 個(gè) JournalNode 節(jié)點(diǎn)。這里使用三臺(tái)主機(jī)進(jìn)行搭建,集群規(guī)劃如下:

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

三、前置條件

  • 所有服務(wù)器都安裝有 JDK,安裝步驟可以參見(jiàn):Linux 下 JDK 的安裝;
  • 搭建好 ZooKeeper 集群,搭建步驟可以參見(jiàn):Zookeeper 單機(jī)環(huán)境和集群環(huán)境搭建
  • 所有服務(wù)器之間都配置好 SSH 免密登錄。

四、集群配置

4.1 下載并解壓

下載 Hadoop。這里我下載的是 CDH 版本 Hadoop,下載地址為:http://archive.cloudera.com/cdh6/cdh/5/

# tar -zvxf hadoop-2.6.0-cdh6.15.2.tar.gz 

4.2 配置環(huán)境變量

編輯 profile 文件:

# vim /etc/profile

增加如下配置:

export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh6.15.2
export  PATH=${HADOOP_HOME}/bin:$PATH

執(zhí)行 source 命令,使得配置立即生效:

# source /etc/profile

4.3 修改配置

進(jìn)入 ${HADOOP_HOME}/etc/hadoop 目錄下,修改配置文件。各個(gè)配置文件內(nèi)容如下:

1. hadoop-env.sh
# 指定JDK的安裝位置
export JAVA_HOME=/usr/java/jdk1.8.0_201/
2. core-site.xml
<configuration>
    <property>
        <!-- 指定 namenode 的 hdfs 協(xié)議文件系統(tǒng)的通信地址 -->
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop001:8020</value>
    </property>
    <property>
        <!-- 指定 hadoop 集群存儲(chǔ)臨時(shí)文件的目錄 -->
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
    </property>
    <property>
        <!-- ZooKeeper 集群的地址 -->
        <name>ha.zookeeper.quorum</name>
        <value>hadoop001:2181,hadoop002:2181,hadoop002:2181</value>
    </property>
    <property>
        <!-- ZKFC 連接到 ZooKeeper 超時(shí)時(shí)長(zhǎng) -->
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>10000</value>
    </property>
</configuration>
3. hdfs-site.xml
<configuration>
    <property>
        <!-- 指定 HDFS 副本的數(shù)量 -->
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <!-- namenode 節(jié)點(diǎn)數(shù)據(jù)(即元數(shù)據(jù))的存放位置,可以指定多個(gè)目錄實(shí)現(xiàn)容錯(cuò),多個(gè)目錄用逗號(hào)分隔 -->
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/namenode/data</value>
    </property>
    <property>
        <!-- datanode 節(jié)點(diǎn)數(shù)據(jù)(即數(shù)據(jù)塊)的存放位置 -->
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/datanode/data</value>
    </property>
    <property>
        <!-- 集群服務(wù)的邏輯名稱 -->
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <property>
        <!-- NameNode ID 列表-->
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <!-- nn1 的 RPC 通信地址 -->
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop001:8020</value>
    </property>
    <property>
        <!-- nn2 的 RPC 通信地址 -->
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop002:8020</value>
    </property>
    <property>
        <!-- nn1 的 http 通信地址 -->
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop001:50070</value>
    </property>
    <property>
        <!-- nn2 的 http 通信地址 -->
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop002:50070</value>
    </property>
    <property>
        <!-- NameNode 元數(shù)據(jù)在 JournalNode 上的共享存儲(chǔ)目錄 -->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
    </property>
    <property>
        <!-- Journal Edit Files 的存儲(chǔ)目錄 -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/journalnode/data</value>
    </property>
    <property>
        <!-- 配置隔離機(jī)制,確保在任何給定時(shí)間只有一個(gè) NameNode 處于活動(dòng)狀態(tài) -->
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <property>
        <!-- 使用 sshfence 機(jī)制時(shí)需要 ssh 免密登錄 -->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <!-- SSH 超時(shí)時(shí)間 -->
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    <property>
        <!-- 訪問(wèn)代理類,用于確定當(dāng)前處于 Active 狀態(tài)的 NameNode -->
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <!-- 開啟故障自動(dòng)轉(zhuǎn)移 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>
4. yarn-site.xml
<configuration>
    <property>
        <!--配置 NodeManager 上運(yùn)行的附屬服務(wù)。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上運(yùn)行 MapReduce 程序。-->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <!-- 是否啟用日志聚合 (可選) -->
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <!-- 聚合日志的保存時(shí)間 (可選) -->
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    <property>
        <!-- 啟用 RM HA -->
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- RM 集群標(biāo)識(shí) -->
        <name>yarn.resourcemanager.cluster-id</name>
        <value>my-yarn-cluster</value>
    </property>
    <property>
        <!-- RM 的邏輯 ID 列表 -->
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <!-- RM1 的服務(wù)地址 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop002</value>
    </property>
    <property>
        <!-- RM2 的服務(wù)地址 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop003</value>
    </property>
    <property>
        <!-- RM1 Web 應(yīng)用程序的地址 -->
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop002:8088</value>
    </property>
    <property>
        <!-- RM2 Web 應(yīng)用程序的地址 -->
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop003:8088</value>
    </property>
    <property>
        <!-- ZooKeeper 集群的地址 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
    </property>
    <property>
        <!-- 啟用自動(dòng)恢復(fù) -->
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- 用于進(jìn)行持久化存儲(chǔ)的類 -->
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>
5. mapred-site.xml
<configuration>
    <property>
        <!--指定 mapreduce 作業(yè)運(yùn)行在 yarn 上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
5. slaves

配置所有從屬節(jié)點(diǎn)的主機(jī)名或 IP 地址,每行一個(gè)。所有從屬節(jié)點(diǎn)上的 DataNode 服務(wù)和 NodeManager 服務(wù)都會(huì)被啟動(dòng)。

hadoop001
hadoop002
hadoop003

4.4 分發(fā)程序

將 Hadoop 安裝包分發(fā)到其他兩臺(tái)服務(wù)器,分發(fā)后建議在這兩臺(tái)服務(wù)器上也配置一下 Hadoop 的環(huán)境變量。

# 將安裝包分發(fā)到hadoop002
scp -r /usr/app/hadoop-2.6.0-cdh6.15.2/  hadoop002:/usr/app/
# 將安裝包分發(fā)到hadoop003
scp -r /usr/app/hadoop-2.6.0-cdh6.15.2/  hadoop003:/usr/app/

五、啟動(dòng)集群

5.1 啟動(dòng)ZooKeeper

分別到三臺(tái)服務(wù)器上啟動(dòng) ZooKeeper 服務(wù):

 zkServer.sh start

5.2 啟動(dòng)Journalnode

分別到三臺(tái)服務(wù)器的的 ${HADOOP_HOME}/sbin 目錄下,啟動(dòng) journalnode 進(jìn)程:

hadoop-daemon.sh start journalnode

5.3 初始化NameNode

hadop001 上執(zhí)行 NameNode 初始化命令:

hdfs namenode -format

執(zhí)行初始化命令后,需要將 NameNode 元數(shù)據(jù)目錄的內(nèi)容,復(fù)制到其他未格式化的 NameNode 上。元數(shù)據(jù)存儲(chǔ)目錄就是我們?cè)?hdfs-site.xml 中使用 dfs.namenode.name.dir 屬性指定的目錄。這里我們需要將其復(fù)制到 hadoop002 上:

 scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/

5.4 初始化HA狀態(tài)

在任意一臺(tái) NameNode 上使用以下命令來(lái)初始化 ZooKeeper 中的 HA 狀態(tài):

hdfs zkfc -formatZK

5.5 啟動(dòng)HDFS

進(jìn)入到 hadoop001${HADOOP_HOME}/sbin 目錄下,啟動(dòng) HDFS。此時(shí) hadoop001hadoop002 上的 NameNode 服務(wù),和三臺(tái)服務(wù)器上的 DataNode 服務(wù)都會(huì)被啟動(dòng):

start-dfs.sh

5.6 啟動(dòng)YARN

進(jìn)入到 hadoop002${HADOOP_HOME}/sbin 目錄下,啟動(dòng) YARN。此時(shí) hadoop002 上的 ResourceManager 服務(wù),和三臺(tái)服務(wù)器上的 NodeManager 服務(wù)都會(huì)被啟動(dòng):

start-yarn.sh

需要注意的是,這個(gè)時(shí)候 hadoop003 上的 ResourceManager 服務(wù)通常是沒(méi)有啟動(dòng)的,需要手動(dòng)啟動(dòng):

yarn-daemon.sh start resourcemanager

六、查看集群

6.1 查看進(jìn)程

成功啟動(dòng)后,每臺(tái)服務(wù)器上的進(jìn)程應(yīng)該如下:

[root@hadoop001 sbin]# jps
4512 DFSZKFailoverController
3714 JournalNode
4114 NameNode
3668 QuorumPeerMain
5012 DataNode
4639 NodeManager

[root@hadoop002 sbin]# jps
4499 ResourceManager
4595 NodeManager
3465 QuorumPeerMain
3705 NameNode
3915 DFSZKFailoverController
5211 DataNode
3533 JournalNode

[root@hadoop003 sbin]# jps
3491 JournalNode
3942 NodeManager
4102 ResourceManager
4201 DataNode
3435 QuorumPeerMain

6.2 查看Web UI

HDFS 和 YARN 的端口號(hào)分別為 500708080,界面應(yīng)該如下:

此時(shí) hadoop001 上的 NameNode 處于可用狀態(tài):

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群
而 hadoop002 上的 NameNode 則處于備用狀態(tài):

<br/>

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群
<br/>

hadoop002 上的 ResourceManager 處于可用狀態(tài):

<br/>

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群
<br/>

hadoop003 上的 ResourceManager 則處于備用狀態(tài):

<br/>

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群
<br/>

同時(shí)界面上也有 Journal Manager 的相關(guān)信息:

<br/>

Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

七、集群的二次啟動(dòng)

上面的集群初次啟動(dòng)涉及到一些必要初始化操作,所以過(guò)程略顯繁瑣。但是集群一旦搭建好后,想要再次啟用它是比較方便的,步驟如下(首選需要確保 ZooKeeper 集群已經(jīng)啟動(dòng)):

hadoop001 啟動(dòng) HDFS,此時(shí)會(huì)啟動(dòng)所有與 HDFS 高可用相關(guān)的服務(wù),包括 NameNode,DataNode 和 JournalNode:

start-dfs.sh

hadoop002 啟動(dòng) YARN:

start-yarn.sh

這個(gè)時(shí)候 hadoop003 上的 ResourceManager 服務(wù)通常還是沒(méi)有啟動(dòng)的,需要手動(dòng)啟動(dòng):

yarn-daemon.sh start resourcemanager

參考資料

以上搭建步驟主要參考自官方文檔:

  • HDFS High Availability Using the Quorum Journal Manager
  • ResourceManager High Availability

關(guān)于 Hadoop 高可用原理的詳細(xì)分析,推薦閱讀:

Hadoop NameNode 高可用 (High Availability) 實(shí)現(xiàn)解析

更多大數(shù)據(jù)系列文章可以參見(jiàn) GitHub 開源項(xiàng)目大數(shù)據(jù)入門指南

標(biāo)題名稱:Hadoop系列(八)——基于ZooKeeper搭建Hadoop高可用集群
鏈接分享:http://jinyejixie.com/article48/ghohhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、虛擬主機(jī)網(wǎng)站維護(hù)、微信小程序軟件開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
涟水县| 祁阳县| 西乌| 石河子市| 宜昌市| 安福县| 南投市| 银川市| 长乐市| 安西县| 东台市| 孟津县| 北碚区| 阳曲县| 布拖县| 大新县| 多伦县| 竹北市| 江油市| 诸城市| 盘锦市| 湟中县| 广州市| 高淳县| 横山县| 应城市| 达日县| 五大连池市| 瑞金市| 合作市| 高阳县| 兴化市| 九寨沟县| 普陀区| 兴海县| 仙桃市| 措美县| 临沂市| 桃源县| 佛坪县| 古浪县|