hadoop 查看节点主备装填_基于ZooKeeper搭建Hadoop高可用集群
一、高可用簡介
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 實現主備切換的流程下圖所示:
?
HealthMonitor 初始化完成之后會啟動內部的線程來定時調用對應 NameNode 的 HAServiceProtocol RPC 接口的方法,對 NameNode 的健康狀態進行檢測。
HealthMonitor 如果檢測到 NameNode 的健康狀態發生變化,會回調 ZKFailoverController 注冊的相應方法進行處理。
如果 ZKFailoverController 判斷需要進行主備切換,會首先使用 ActiveStandbyElector 來進行自動的主備選舉。
ActiveStandbyElector 與 Zookeeper 進行交互完成自動的主備選舉。
ActiveStandbyElector 在主備選舉完成后,會回調 ZKFailoverController 的相應方法來通知當前的 NameNode 成為主 NameNode 或備 NameNode。
ZKFailoverController 調用對應 NameNode 的 HAServiceProtocol RPC 接口的方法將 NameNode 轉換為 Active 狀態或 Standby 狀態。
1.4 YARN高可用
YARN ResourceManager 的高可用與 HDFS NameNode 的高可用類似,但是 ResourceManager 不像 NameNode ,沒有那么多的元數據信息需要維護,所以它的狀態信息可以直接寫到 Zookeeper 上,并依賴 Zookeeper 來進行主備選舉。
二、集群規劃
按照高可用的設計目標:需要保證至少有兩個 NameNode (一主一備) ?和 兩個 ResourceManager (一主一備) ?,同時為滿足“過半寫入則成功”的原則,需要至少要有 3 個 JournalNode 節點。這里使用三臺主機進行搭建,集群規劃如下:
?
三、前置條件
所有服務器都安裝有 JDK,安裝步驟可以參見:Linux 下 JDK 的安裝;
搭建好 ZooKeeper 集群,搭建步驟可以參見:Zookeeper 單機環境和集群環境搭建
所有服務器之間都配置好 SSH 免密登錄。
四、集群配置
4.1 下載并解壓
下載 Hadoop。這里我下載的是 CDH 版本 Hadoop,下載地址為:http://archive.cloudera.com/cdh5/cdh/5/
# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz4.2 配置環境變量
編輯 profile 文件:
# vim /etc/profile增加如下配置:
export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2export PATH=${HADOOP_HOME}/bin:$PATH執行 source 命令,使得配置立即生效:
# source /etc/profile4.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> ? ? ? ? ? ? ? ?<name>fs.defaultFSname> ? ? ? ?<value>hdfs://hadoop001:8020value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>hadoop.tmp.dirname> ? ? ? ?<value>/home/hadoop/tmpvalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>ha.zookeeper.quorumname> ? ? ? ?<value>hadoop001:2181,hadoop002:2181,hadoop003:2181value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>ha.zookeeper.session-timeout.msname> ? ? ? ?<value>10000value> ? ?property>configuration>3. hdfs-site.xml
<configuration> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.replicationname> ? ? ? ?<value>3value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.name.dirname> ? ? ? ?<value>/home/hadoop/namenode/datavalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.datanode.data.dirname> ? ? ? ?<value>/home/hadoop/datanode/datavalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.nameservicesname> ? ? ? ?<value>myclustervalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.ha.namenodes.myclustername> ? ? ? ?<value>nn1,nn2value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.rpc-address.mycluster.nn1name> ? ? ? ?<value>hadoop001:8020value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.rpc-address.mycluster.nn2name> ? ? ? ?<value>hadoop002:8020value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.http-address.mycluster.nn1name> ? ? ? ?<value>hadoop001:50070value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.http-address.mycluster.nn2name> ? ? ? ?<value>hadoop002:50070value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.namenode.shared.edits.dirname> ? ? ? ?<value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/myclustervalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.journalnode.edits.dirname> ? ? ? ?<value>/home/hadoop/journalnode/datavalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.ha.fencing.methodsname> ? ? ? ?<value>sshfencevalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.ha.fencing.ssh.private-key-filesname> ? ? ? ?<value>/root/.ssh/id_rsavalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.ha.fencing.ssh.connect-timeoutname> ? ? ? ?<value>30000value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.client.failover.proxy.provider.myclustername> ? ? ? ?<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>dfs.ha.automatic-failover.enabledname> ? ? ? ?<value>truevalue> ? ?property>configuration>4. yarn-site.xml
<configuration> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.nodemanager.aux-servicesname> ? ? ? ?<value>mapreduce_shufflevalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.log-aggregation-enablename> ? ? ? ?<value>truevalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.log-aggregation.retain-secondsname> ? ? ? ?<value>86400value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.ha.enabledname> ? ? ? ?<value>truevalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.cluster-idname> ? ? ? ?<value>my-yarn-clustervalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.ha.rm-idsname> ? ? ? ?<value>rm1,rm2value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.hostname.rm1name> ? ? ? ?<value>hadoop002value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.hostname.rm2name> ? ? ? ?<value>hadoop003value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.webapp.address.rm1name> ? ? ? ?<value>hadoop002:8088value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.webapp.address.rm2name> ? ? ? ?<value>hadoop003:8088value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.zk-addressname> ? ? ? ?<value>hadoop001:2181,hadoop002:2181,hadoop003:2181value> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.recovery.enabledname> ? ? ? ?<value>truevalue> ? ?property> ? ?<property> ? ? ? ? ? ? ? ?<name>yarn.resourcemanager.store.classname> ? ? ? ?<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue> ? ?property>configuration>5. ?mapred-site.xml
<configuration> ? ?<property> ? ? ? ? ? ? ? ?<name>mapreduce.framework.namename> ? ? ? ?<value>yarnvalue> ? ?property>configuration>5. slaves
配置所有從屬節點的主機名或 IP 地址,每行一個。所有從屬節點上的 DataNode 服務和 NodeManager 服務都會被啟動。
hadoop001hadoop002hadoop0034.4 分發程序
將 Hadoop 安裝包分發到其他兩臺服務器,分發后建議在這兩臺服務器上也配置一下 Hadoop 的環境變量。
# 將安裝包分發到hadoop002scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/# 將安裝包分發到hadoop003scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/五、啟動集群
5.1 啟動ZooKeeper
分別到三臺服務器上啟動 ZooKeeper 服務:
zkServer.sh start5.2 啟動Journalnode
分別到三臺服務器的的 ${HADOOP_HOME}/sbin 目錄下,啟動 journalnode 進程:
hadoop-daemon.sh start journalnode5.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 -formatZK5.5 啟動HDFS
進入到 hadoop001 的 ${HADOOP_HOME}/sbin 目錄下,啟動 HDFS。此時 hadoop001 和 hadoop002 上的 NameNode 服務,和三臺服務器上的 DataNode 服務都會被啟動:
start-dfs.sh5.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]# jps4512 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 的端口號分別為 50070 和 8080,界面應該如下:
此時 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參考資料
以上搭建步驟主要參考自官方文檔:
HDFS High Availability Using the Quorum Journal Manager
ResourceManager High Availability
關于 Hadoop 高可用原理的詳細分析,推薦閱讀:
Hadoop NameNode 高可用 (High Availability) 實現解析
總結
以上是生活随笔為你收集整理的hadoop 查看节点主备装填_基于ZooKeeper搭建Hadoop高可用集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈和队列都是什么结构_数据结构与算法之初
- 下一篇: java中的boolean_java中b