基於 ZooKeeper 搭建 Hadoop 高可用集群

来源:https://www.cnblogs.com/heibaiying/archive/2019/06/23/11071857.html
-Advertisement-
Play Games

一、高可用簡介 二、集群規劃 三、前置條件 四、集群配置 五、啟動集群 六、查看集群 七、集群的二次啟動 一、高可用簡介 Hadoop 高可用 (High Availability) 分為 HDFS 高可用和 YARN 高可用,兩者的實現基本類似,但 HDFS NameNode 對數據存儲及其一致性 ...


一、高可用簡介

Hadoop 高可用 (High Availability) 分為 HDFS 高可用和 YARN 高可用,兩者的實現基本類似,但 HDFS NameNode 對數據存儲及其一致性的要求比 YARN ResourceManger 高得多,所以它的實現也更加複雜,故下麵先進行講解:

1.1 高可用整體架構

HDFS 高可用架構如下:

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

HDFS 高可用架構主要由以下組件所構成:

  • Active NameNode 和 Standby NameNode:兩台 NameNode 形成互備,一臺處於 Active 狀態,為主 NameNode,另外一臺處於 Standby 狀態,為備 NameNode,只有主 NameNode 才能對外提供讀寫服務。
  • 主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨立的進程運行,對 NameNode 的主備切換進行總體控制。ZKFailoverController 能及時檢測到 NameNode 的健康狀況,在主 NameNode 故障時藉助 Zookeeper 實現自動的主備選舉和切換,當然 NameNode 目前也支持不依賴於 Zookeeper 的手動主備切換。
  • Zookeeper 集群:為主備切換控制器提供主備選舉支持。
  • 共用存儲系統:共用存儲系統是實現 NameNode 的高可用最為關鍵的部分,共用存儲系統保存了 NameNode 在運行過程中所產生的 HDFS 的元數據。主 NameNode 和 NameNode 通過共用存儲系統實現元數據同步。在進行主備切換的時候,新的主 NameNode 在確認元數據完全同步之後才能繼續對外提供服務。
  • DataNode 節點:除了通過共用存儲系統共用 HDFS 的元數據信息之外,主 NameNode 和備 NameNode 還需要共用 HDFS 的數據塊和 DataNode 之間的映射關係。DataNode 會同時向主 NameNode 和備 NameNode 上報數據塊的位置信息。

1.2 基於 QJM 的共用存儲系統的數據同步機制分析

目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作為共用的存儲系統,這裡以 QJM 集群為例進行說明:Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然後 Standby NameNode 再從 JournalNode 集群定時同步 EditLog,當 Active NameNode 宕機後, Standby NameNode 在確認元數據完全同步之後就可以對外提供服務。

需要說明的是向 JournalNode 集群寫入 EditLog 是遵循 “過半寫入則成功” 的策略,所以你至少要有3個 JournalNode 節點,當然你也可以繼續增加節點數量,但是應該保證節點總數是奇數。同時如果有 2N+1 台 JournalNode,那麼根據過半寫的原則,最多可以容忍有 N 台 JournalNode 節點掛掉。

1.3 NameNode 主備切換

NameNode 實現主備切換的流程下圖所示:

  1. HealthMonitor 初始化完成之後會啟動內部的線程來定時調用對應 NameNode 的 HAServiceProtocol RPC 介面的方法,對 NameNode 的健康狀態進行檢測。

  2. HealthMonitor 如果檢測到 NameNode 的健康狀態發生變化,會回調 ZKFailoverController 註冊的相應方法進行處理。

  3. 如果 ZKFailoverController 判斷需要進行主備切換,會首先使用 ActiveStandbyElector 來進行自動的主備選舉。

  4. ActiveStandbyElector 與 Zookeeper 進行交互完成自動的主備選舉。

  5. ActiveStandbyElector 在主備選舉完成後,會回調 ZKFailoverController 的相應方法來通知當前的 NameNode 成為主 NameNode 或備 NameNode。

  6. ZKFailoverController 調用對應 NameNode 的 HAServiceProtocol RPC 介面的方法將 NameNode 轉換為 Active 狀態或 Standby 狀態。

1.4 YARN高可用

YARN ResourceManager 的高可用與 HDFS NameNode 的高可用類似,但是 ResourceManager 不像 NameNode ,沒有那麼多的元數據信息需要維護,所以它的狀態信息可以直接寫到 Zookeeper 上,並依賴 Zookeeper 來進行主備選舉。

二、集群規劃

按照高可用的設計目標:需要保證至少有兩個 NameNode (一主一備) 和 兩個 ResourceManager (一主一備) ,同時為滿足“過半寫入則成功”的原則,需要至少要有3個 JournalNode 節點。這裡使用三台主機進行搭建,集群規劃如下:

三、前置條件

四、集群配置

4.1 下載並解壓

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

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

4.2 配置環境變數

編輯profile文件:

# vim /etc/profile

增加如下配置:

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

執行source命令,使得配置立即生效:

# source /etc/profile

4.3 修改配置

進入${HADOOP_HOME}/etc/hadoop目錄下,修改配置文件。各個配置文件內容如下:

1. hadoop-env.sh

# 指定JDK的安裝位置
export JAVA_HOME=/usr/java/jdk1.8.0_201/

2. core-site.xml

<configuration>
    <property>
        <!-- 指定namenode的hdfs協議文件系統的通信地址 -->
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop001:8020</value>
    </property>
    <property>
        <!-- 指定hadoop集群存儲臨時文件的目錄 -->
        <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超時時長 -->
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>10000</value>
    </property>
</configuration>

3. hdfs-site.xml

<configuration>
    <property>
        <!-- 指定HDFS副本的數量 -->
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <!-- namenode節點數據(即元數據)的存放位置,可以指定多個目錄實現容錯,多個目錄用逗號分隔 -->
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/namenode/data</value>
    </property>
    <property>
        <!-- datanode節點數據(即數據塊)的存放位置 -->
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/datanode/data</value>
    </property>
    <property>
        <!-- 集群服務的邏輯名稱 -->
        <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元數據在JournalNode上的共用存儲目錄 -->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
    </property>
    <property>
        <!-- Journal Edit Files的存儲目錄 -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/journalnode/data</value>
    </property>
    <property>
        <!-- 配置隔離機制,確保在任何給定時間只有一個NameNode處於活動狀態 -->
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <property>
        <!-- 使用sshfence機制時需要ssh免密登錄 -->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <!-- SSH超時時間 -->
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    <property>
        <!-- 訪問代理類,用於確定當前處於Active狀態的NameNode -->
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <!-- 開啟故障自動轉移 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>

4. yarn-site.xml

<configuration>
    <property>
        <!--配置NodeManager上運行的附屬服務。需要配置成mapreduce_shuffle後才可以在Yarn上運行MapReduce程式。-->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <!-- 是否啟用日誌聚合(可選) -->
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <!-- 聚合日誌的保存時間(可選) -->
        <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集群標識 -->
        <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的服務地址 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop002</value>
    </property>
    <property>
        <!-- RM2的服務地址 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop003</value>
    </property>
    <property>
        <!-- RM1 Web應用程式的地址 -->
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop002:8088</value>
    </property>
    <property>
        <!-- RM2 Web應用程式的地址 -->
        <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>
        <!-- 啟用自動恢復 -->
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- 用於進行持久化存儲的類 -->
        <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作業運行在yarn上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5. slaves

配置所有從屬節點的主機名或IP地址,每行一個。所有從屬節點上的DataNode服務和NodeManager服務都會被啟動。

hadoop001
hadoop002
hadoop003

4.4 分發程式

將Hadoop安裝包分發到其他兩台伺服器,分發後建議在這兩台伺服器上也配置一下Hadoop的環境變數。

# 將安裝包分發到hadoop002
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/  hadoop002:/usr/app/
# 將安裝包分發到hadoop003
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/  hadoop003:/usr/app/

五、啟動集群

5.1 啟動ZooKeeper

分別到三台伺服器上啟動ZooKeeper服務:

 zkServer.sh start

5.2 啟動Journalnode

分別到三台伺服器的的${HADOOP_HOME}/sbin目錄下,啟動journalnode進程:

hadoop-daemon.sh start journalnode

5.3 初始化NameNode

hadop001上執行NameNode初始化命令:

hdfs namenode -format

執行初始化命令後,需要將NameNode元數據目錄的內容,複製到其他未格式化的NameNode上。元數據存儲目錄就是我們在hdfs-site.xml中使用dfs.namenode.name.dir屬性指定的目錄。這裡我們需要將其複製到hadoop002上:

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

5.4 初始化HA狀態

在任意一臺NameNode上使用以下命令來初始化ZooKeeper中的HA狀態:

hdfs zkfc -formatZK

5.5 啟動HDFS

進入到hadoop001${HADOOP_HOME}/sbin目錄下,啟動HDFS。此時hadoop001hadoop002上的NameNode服務,和三台伺服器上的DataNode服務都會被啟動:

start-dfs.sh

5.6 啟動YARN

進入到hadoop002${HADOOP_HOME}/sbin目錄下,啟動YARN。此時hadoop002上的ResourceManager服務,和三台伺服器上的NodeManager服務都會被啟動:

start-yarn.sh

需要註意的是,這個時候hadoop003上的ResourceManager服務通常是沒有啟動的,需要手動啟動:

yarn-daemon.sh start resourcemanager

六、查看集群

6.1 查看進程

成功啟動後,每台伺服器上的進程應該如下:

[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的埠號分別為500708080,界面應該如下:

此時hadoop001上的NameNode處於可用狀態:

而hadoop002上的NameNode則處於備用狀態:



hadoop002上的ResourceManager處於可用狀態:



hadoop003上的ResourceManager則處於備用狀態:



同時界面上也有Journal Manager的相關信息:


七、集群的二次啟動

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

hadoop001啟動 HDFS,此時會啟動所有與 HDFS 高可用相關的服務,包括 NameNode,DataNode 和 JournalNode:

start-dfs.sh

hadoop002啟動YARN:

start-yarn.sh

這個時候hadoop003上的ResourceManager服務通常還是沒有啟動的,需要手動啟動:

yarn-daemon.sh start resourcemanager

參考資料

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

關於Hadoop高可用原理的詳細分析,推薦閱讀:

Hadoop NameNode 高可用 (High Availability) 實現解析

更多大數據系列文章可以參見個人 GitHub 開源項目: 大數據入門指南


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /* 函數處理數據的一個問題就是每個DBMS都有特定的函數,在不同的DBMS中,各個函數的名稱和語法可能極其不同這意味著特定SQL實現編寫的代碼在其他視線中可能不正常*/ -- 在MySQL中: /* 提取字元串的組成部分 SUBSTRING()數據類型轉換 CONVERT()取當前日期 CURDA ...
  • DDL DDL是DBMS的核心組件,是SQL的重要組成部分. DDL的正確性和穩定性是整個SQL髮型的重要基礎. DDL的基礎語法及設計工具 DDL的英文是Data Definition Language,也就是數據定義語言.定義了資料庫的結構和數據表的結構.常用的功能急救室增刪改,對應的命令分別是 ...
  • Redis目錄分析 Windows版的配置文件是redis.windows.conf,LInux版的配置文件redis.conf。 伺服器端命令 安裝服務: redis-server --service-install D:\Redis-x64-3.2.100\redis.windows.conf ...
  • 緩存命中率的介紹 命中:可以直接通過緩存獲取到需要的數據。 不命中:無法直接通過緩存獲取到想要的數據,需要再次查詢資料庫或者執行其它的操作。原因可能是由於緩存中根本不存在,或者緩存已經過期。 通常來講,緩存的命中率越高則表示使用緩存的收益越高,應用的性能越好(響應時間越短、吞吐量越高),抗併發的能力 ...
  • MySql報錯 [toc] 1. 1062 duplicate entry '0' for key 'xxx' 1.1 報錯場景 在建立索引的時候報此錯誤。 1.2 報錯原因 索引或者主鍵有重覆鍵 1.3 解決方法 刪除重覆的索引或者主鍵條目,即可。 1.4 具體舉例 給MAC建立索引表的時候,會報 ...
  • show命令 show 命令可以提供關於資料庫、表、列,或關於伺服器的狀態信息。 總結 實例 顯示建表建庫語句 sql mysql SHOW DATABASES; + + | Database | + + | information_schema | | mysql | | performance_ ...
  • -- 通配符進行過濾 #使用條件是只能用於文本欄位(字元串),非文本數據類型欄位不能使用通配符搜索 -- LIKE操作符/* 當過濾中使用的值都是已知的時候可以不用通配符,但是當數據量很大 需要進行搜索特定條件的值,簡單的比較操作符肯定不行,這時候利用通配符,可以創建比較特定數據的搜索模式。什麼是通 ...
  • 當下,大數據方面的就業主要有三大方向:一是數據分析類大數據人才,二是系統研發類大數據人才,三是應用開發類大數據人才。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...