Hadoop-HA高可用分佈式集羣總結

覺得有幫助的,請多多支持博主,點贊關注哦~

Hadoop-HA高可用分佈式集羣

一、HA概述

  1. 所謂 HA(high available),即高可用(7*24 小時不中斷服務)
  2. 實現高可用最關鍵的策略是消除單點故障
    HA 嚴格來說應該分成各個組件的 HA 機制:HDFS 的 HA 和 YARN 的 HA
  3. Hadoop2.0 之前,在 HDFS 集羣中 NameNode 存在單點故障(SPOF)
  4. NameNode 主要在以下兩個方面影響 HDFS 集羣
    NameNode 機器發生意外,如宕機,集羣將無法使用,直到管理員重啓
    NameNode 機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用

HDFS HA 功能通過配置 Active/Standby 兩個 nameNodes 實現在集羣中對 NameNode 的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將 NameNode 很快的切換到另外一臺機器

二、HDFS-HA 工作機制

通過雙 namenode 消除單點故障

1、HDFS-HA 工作要點

1、元數據管理方式需要改變:

  • 內存中各自保存一份元數據;
  • Edits 日誌只有 Active 狀態的 namenode 節點可以做寫操作;
  • 兩個 namenode 都可以讀取 edits;
  • 共享的 edits 放在一個共享存儲中管理(qjournal 和 NFS 兩個主流實現);

2、需要一個狀態管理功能模塊

實現了一個 zkfailover,常駐在每一個 namenode 所在的節點,每一個 zkfailover 負責監控自己所在 namenode 節點,利用 zk 進行狀態標識,當需要進行狀態切換時,由 zkfailover來負責切換,切換時需要防止 brain split 現象的發生。

3、必須保證兩個 NameNode 之間能夠 ssh 無密碼登錄

4、隔離(Fence),即同一時刻僅僅有一個 NameNode 對外提供服務

2、HDFS-HA 自動故障轉移工作機制

在這裏插入圖片描述
自動故障轉移爲 HDFS 部署增加了兩個新組件:

  1. ZooKeeper 進程
  2. ZKFailoverController(ZKFC)進程

ZooKeeper 是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。
HA 的自動故障轉移依賴於ZooKeeper 的以下功能:

  1. 故障檢測:集羣中的每個 NameNode 在 ZooKeeper 中維護了一個持久會話,如果機器崩潰,ZooKeeper 中的會話將終止,ZooKeeper 通知另一個 NameNode 需要觸發故障轉移。
  2. 現役 NameNode 選擇:ZooKeeper 提供了一個簡單的機制用於唯一的選擇一個節點爲 active 狀態。如果目前現役 NameNode 崩潰,另一個節點可能從 ZooKeeper 獲得特殊的排外鎖以表明它應該成爲現役 NameNode。

ZKFC 是自動故障轉移中的另一個新組件,是 ZooKeeper 的客戶端,也監視和管理NameNode 的狀態。
每個運行 NameNode 的主機也運行了一個 ZKFC 進程,ZKFC 負責

  1. 健康監測:ZKFC 使用一個健康檢查命令定期地 ping 與之在相同主機的 NameNode,只要該 NameNode 及時地回覆健康狀態,ZKFC 認爲該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點爲非健康的。
  2. ZooKeeper 會話管理:當本地 NameNode 是健康的,ZKFC 保持一個在 ZooKeeper中打開的會話。如果本地 NameNode 處於 active 狀態,ZKFC 也保持一個特殊的 znode 鎖,該鎖使用了 ZooKeeper 對短暫節點的支持,如果會話終止,鎖節點將自動刪除。
  3. 基於 ZooKeeper 的選擇:如果本地 NameNode 是健康的,且 ZKFC 發現沒有其它的節點當前持有 znode 鎖,它將爲自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地 NameNode 爲 active。故障轉移進程與前面描述的手動故障轉移相似,首先如果必要保護之前的現役 NameNode,然後本地 NameNode 轉換爲 active 狀態。

三、總體配置及準備規劃

這裏先將需要修改的配置文件整體總結一下,後續詳細說明配置功能。

1、集羣規劃

在這裏插入圖片描述

2、準備工作

1、根據規劃,需要四臺機器。

  • 1和2配置namenode;
  • 1、2、3配置zookeeper;
  • 3、4配置resourcemanager。

2、四臺機器完成配置Hadoop完全分佈式,123完成zookeeper完全分佈式配置。忘記了的可以回去查看我之前的總結。

3、修改配置文件

HA配置,主要修改了core-site.xml、yarn-site.xml、hdfs-site.xml三個配置文件。其他的基本沒有改動。

這裏將整體總結一下,後邊會詳細講作用。

1、core-site.xml
在這裏插入圖片描述

2、yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
  <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>604800</value>
</property>

<!--配置uber mode可用-->
<property>
        <name>mapreduce.job.ubertask.enable</name>
        <value>true</value>
</property>

<!--配置ha-->
<property>
 <name>yarn.resourcemanager.ha.enabled</name>
 <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>yrc</value>
</property>
<property>
 <name>yarn.resourcemanager.ha.rm-ids</name>
 <value>RM1,RM2</value>
</property>
<property>
 <name>yarn.resourcemanager.hostname.RM1</name>
 <value>biubiubiu03</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.RM2</name>
  <value>biubiubiu04</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>biubiubiu01:2181,biubiubiu02:2181,biubiubiu03: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>

3、hdfs-site.xml

<configuration>
<property>
     <name>dfs.replication</name>
     <value>3</value>
  </property>
 <property>
    <name>dfs.name.dir</name>
    <value>file:///opt/model/hadoop_data/dfs/name</value>
  </property>
   <property>
    <name>dfs.data.dir</name>
    <value>file:///opt/model/hadoop_data/dfs/data</value>
  </property>
  <property>
    <name>dfs.block.size</name>
    <value>134217728</value>
  </property>
  <property>
   <name>fs.checkpoint.dir</name>
   <value>file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
  </property>
  <property>
   <name>fs.checkpoint.edits.dir</name>
   <value>file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
  </property>
  <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
  </property>
  <property>
   <name>dfs.permissions</name>
   <value>false</value>
  </property>
<!--配置ha-->
  <property>
   <name>dfs.datanode.max.transfer.threads</name>
   <value>4096</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>NN1,NN2</value>
  </property>
  <property>
   <name>dfs.namenode.rpc-address.mycluster.NN1</name>
    <value>biubiubiu01:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.NN2</name>
    <value>biubiubiu02:9000</value>
  </property>
 <property>
 <name>dfs.namenode.servicepc-address.mycluster.NN1</name>
  <value>biubiubiu01:53310</value>
  </property>
<property>
 <name>dfs.namenode.servicepc-address.mycluster.NN2</name>
  <value>biubiubiu02:53310</value>
  </property>

<property>
 <name>dfs.namenode.http-address.mycluster.NN1</name>
  <value>biubiubiu01:50070</value>
  </property>
<property>
 <name>dfs.namenode.http-address.mycluster.NN2</name>
  <value>biubiubiu02:50070</value>
  </property>

<property>
 <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/model/hadoop_data/dfs/jndata</value>
</property>

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

<property>
 <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
  </property>
<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop01/.ssh/id_rsa</value>
</property>

<property>
 <name>dfs.namenode.edits.dir</name>
  <value>/opt/model/hadoop_data/dfs/edits</value>
  </property>
<property>
 <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>
</configuration>

四、HDFS-HA 集羣配置

1、配置HDFS-HA集羣

  1. 配置 core-site.xml
<configuration>
<!-- 把兩個 NameNode的地址組裝成一個集羣 mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/model/hadoop-2.7.2/hadoop_data/tmp</value>
</property>
</configuration>
  1. 配置 hdfs-site.xml
<configuration>
<!-- 完全分佈式集羣名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集羣中 NameNode 節點都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>NN1,NN2</value>
</property>
<!-- NN1 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.NN1</name>
<value>biubiubiu01:9000</value>
</property>
<!-- NN2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.NN2</name>
<value>biubiubiu02:9000</value>
</property>
<!-- NN1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.NN1</name>
<value>biubiubiu01:50070</value>
</property>
<!-- NN2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.NN2</name>
<value>biubiubiu02:50070</value>
</property>
<!-- 指定 NameNode 元數據在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>
<!-- 配置隔離機制,即同一時刻只能有一臺服務器對外響應 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要 ssh 無祕鑰登錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop01/.ssh/id_rsa</value>
</property>
<!-- 聲明 journalnode 服務器存儲目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/model/hadoop_data/dfs/jndata</value>
</property>
<!-- 關閉權限檢查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 訪問代理類:client,mycluster,active 配置失敗自動切換實現方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</
value>
</property>
</configuration>

scp分發到其他節點機器。

2、配置 HDFS-HA 自動故障轉移

  1. 在 hdfs-site.xml 中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
  1. 在 core-site.xml 文件中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>

五、YARN-HA 配置

1、YARN-HA 工作機制

官方文檔:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

YARN-HA 工作機制:
在這裏插入圖片描述

2、配置 YARN-HA 集羣

規劃如上,配置rm在3、4臺機器上。

修改yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--啓用 resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺 resourcemanager 的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>biubiubiu03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>biubiubiu04</value>
</property>
<!--指定 zookeeper 集羣的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>
<!--啓用自動恢復-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定 resourcemanager 的狀態信息存儲在 zookeeper 集羣-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore<
/value>
</property>
</configuration>

scp分發到其他節點機器。

六、整體啓動

1、啓動zookeeper

# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分別啓動zookeeper
[hadoop01@biubiubiu01 model]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu02 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu03 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 分別jsp
[hadoop01@biubiubiu01 model]$ jps
3361 Jps
3318 QuorumPeerMain

2、啓動journalnode

# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分別啓動journalnode
[hadoop01@biubiubiu01 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu02 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu03 hadoop]$ hadoop-daemon.sh start journalnode

# jps查看進程
[hadoopenv@os1 hadoop]$ jps
2041 JournalNode
3361 Jps
3318 QuorumPeerMain

3、格式化namenode

# 僅僅在biubiubiu01上格式化一次
[hadoop01@biubiubiu01 hadoop]$ hdfs namenode -format
# 複製biubiubiu01上的namenode的元數據到第二臺biubiubiu02
[hadoop01@biubiubiu01 hadoop_data]$ scp -r /opt/model/hadoop_data biubiubiu02:/opt/model

4、格式化zkfc

# 在namenode節點(biubiubiu01、biubiubiu02)格式化zkfc
[hadoop01@biubiubiu01 hadoop_data]$ hdfs zkfc -formatZK
[hadoop01@biubiubiu02 hadoop_data]$ hdfs zkfc -formatZK

5、啓動dfs

# biubiubiu01 啓動dfs
[hadoop01@biubiubiu01 model]$ start-dfs.sh
Starting namenodes on [biubiubiu01 biubiubiu02]
biubiubiu02: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu02.out
biubiubiu01: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu01.out
biubiubiu02: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu02.out
biubiubiu01: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu01.out
biubiubiu03: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu03.out
biubiubiu04: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu04.out

Starting journal nodes [biubiubiu01 biubiubiu02 biubiubiu03]
biubiubiu01: journalnode running as process 2019. Stop it first.
biubiubiu03: journalnode running as process 1927. Stop it first.
biubiubiu02: journalnode running as process 1916. Stop it first.

Starting ZK Failover Controllers on NN hosts [biubiubiu01 biubiubiu02]
biubiubiu01: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu01.out
biubiubiu02: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu02.out


# 分別jps查看進程效果
[hadoop01@biubiubiu01 model]$ jps
2305 NameNode
2019 JournalNode
2888 Jps
2777 DFSZKFailoverController
2458 DataNode
1916 QuorumPeerMain

[hadoop01@biubiubiu02 model]$ jps
2321 DFSZKFailoverController
2435 Jps
2071 NameNode
2185 DataNode
1819 QuorumPeerMain
1916 JournalNode

[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2177 Jps
1927 JournalNode
1822 QuorumPeerMain

[hadoop01@biubiubiu04 model]$ jps
1742 DataNode
1855 Jps

6、查看namenode的狀態

[hadoop01@biubiubiu01 model]$ hdfs haadmin -getServiceState NN1
active
[hadoop01@biubiubiu02 model]$ hdfs haadmin -getServiceState NN2
standby

在這裏插入圖片描述
在這裏插入圖片描述

7、啓動yarn

# 在biubiubiu01 啓動yarn
[hadoop01@biubiubiu01 sbin]$ start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu01.out
biubiubiu04: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu04.out
biubiubiu01: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu01.out
biubiubiu02: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu02.out
biubiubiu03: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu03.out

# 在biubiubiu03、biubiubiu04上啓動resourcemanager
[hadoop01@biubiubiu03 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu03.out

[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2416 ResourceManager
1927 JournalNode
2458 Jps
2269 NodeManager
1822 QuorumPeerMain

[hadoop01@biubiubiu04 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu04.out

[hadoop01@biubiubiu04 model]$ jps
1907 NodeManager
2044 ResourceManager
1742 DataNode
2078 Jps

8、查看resourcemanager的狀態

[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM1
standby
[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM2
active

在這裏插入圖片描述

9、注意

有很多人測試說,啓動了兩個NameNode,一個active,一個standby,如果將avtive的手動殺死(kill -9 端口號),不會立刻將standby的切換爲active,需要重啓才行?

這是因爲NameNode節點機器中沒有安裝psmisc,導致fuser這個命令找不到,所以不能自動切換。
此時需要在NameNode節點機器中安裝一下就可以了。

sudo yum install -y psmisc

七、HDFS Federation 架構設計

1、NameNode 架構的侷限性

  1. Namespace(命名空間)的限制
    由於 NameNode 在內存中存儲所有的元數據(metadata),因此單個 namenode 所能存儲的對象(文件+塊)數目受到 namenode 所在 JVM 的 heap size 的限制。50G 的 heap 能夠存儲 20 億(200million)個對象,這 20 億個對象支持 4000 個 datanode,12PB 的存儲(假設文件平均大小爲 40MB)。隨着數據的飛速增長,存儲的需求也隨之增長。單個 datanode 從4T增長到 36T,集羣的尺寸增長到 8000 個 datanode。存儲的需求從 12PB 增長到大於100PB。
  2. 隔離問題
    由於 HDFS 僅有一個 namenode,無法隔離各個程序,因此 HDFS 上的一個實驗程序就很有可能影響整個 HDFS 上運行的程序。
  3. 性能的瓶頸
    由於是單個 namenode 的 HDFS 架構,因此整個 HDFS 文件系統的吞吐量受限於單個namenode 的吞吐量。

2、HDFS Federation 架構設計

能不能有多個 NameNode
NameNode NameNode NameNode
元數據 元數據 元數據
Log machine 電商數據/話單數據

在這裏插入圖片描述

3、HDFS Federation 應用思考

不同應用可以使用不同 NameNode 進行數據管理

  • 圖片業務、爬蟲業務、日誌審計業務

Hadoop 生態系統中,不同的框架使用不同的 namenode 進行管理 namespace。(隔離性)

覺得有幫助的,請多多支持博主,點贊關注哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章