[轉]HDFS HA 部署安裝

1. HDFS 2.0 基本概念

 

相比於 Hadoop 1.0,Hadoop 2.0 中的 HDFS 增長了兩個重大特性,HA 和 Federaion。HA 即爲 High Availability,用於解決 NameNode 單點故障問題,該特性經過熱備的方式爲主 NameNode 提供一個備用者,一旦主 NameNode 出現故障,能夠迅速切換至備 NameNode, 從而實現不間斷對外提供服務。Federation 即爲「聯邦」,該特性容許一個 HDFS 集羣中存在 多個 NameNode 同時對外提供服務,這些 NameNode 分管一部分目錄(水平切分),彼此之 間相互隔離,但共享底層的 DataNode 存儲資源。html

本文檔重點介紹 HDFS HA 和 Federation 的安裝部署方法。 node

 

2. HDFS HA 配置部署

2.1 HDFS HA 架構

在一個典型的 HDFS HA 場景中,一般由兩個 NameNode 組成,一個處於 active 狀態, 另外一個處於 standby 狀態。Active NameNode 對外提供服務,好比處理來自客戶端的 RPC 請 求,而 Standby NameNode 則不對外提供服務,僅同步 active namenode 的狀態,以便可以在 它失敗時快速進行切換。
爲了可以實時同步 Active 和 Standby 兩個 NameNode 的元數據信息(實際上 editlog), 需提供一個共享存儲系統,能夠是 NFS、QJM(Quorum Journal Manager)或者 Bookeeper, Active Namenode 將數據寫入共享存儲系統,而 Standby 監聽該系統,一旦發現有新數據寫 入,則讀取這些數據,並加載到本身內存中,以保證本身內存狀態與 Active NameNode 保持 基本一致,如此這般,在緊急狀況下 standby 即可快速切爲 active namenode。web


注意,在 Hadoop 2.0 中,再也不須要 secondary namenode 或者 backup namenode,它們的 工做由 Standby namenode 承擔。
本文將重點介紹基於 QJM 的 HA 解決方案。在該方案中,主備 NameNode 之間經過一組 JournalNode 同步元數據信息,一條數據只要成功寫入多數 JournalNode 即認爲寫入成功。 一般配置奇數個(2N+1)個 JournalNode,這樣,只要 N+1 個寫入成功就認爲數據寫入成功, 此時最多容忍 N-1 個 JournalNode 掛掉,好比 3 個 JournalNode 時,最多容許 1 個 JournalNode 掛掉,5 個 JournalNode 時,最多容許 2 個 JournalNode 掛掉。基於 QJM 的 HDFS 架構以下 所示:shell

 

2.2 硬件選擇及軟件準備

(1) 硬件選擇

 

 NameNode 機器:推薦主備 NameNode 具備相同的硬件配置,且內存要足夠大。apache

 JournalNode:一般準備 3 或 5 個 JournalNode,考慮到 JournalNode 很是輕量級,能夠與 Hadoop 其餘服務共用機器,好比 ResourceManager,TaskTracker 等。bootstrap

 Zookeeper:因爲 Hadoop 多個服務用到了 Zookeeper,可搭建一個 3 或者 5 個節點的Zookeeper 實例做爲公共服務。Zookeeper 實例也能夠與其餘服務共用機器。安全

(2) 軟件準備

  Apache Hadoop 2.2.0 或者更高版本,或 cdh4 以及更高版本
 
  JDK 1.6 或者更高版本,注意,cdh5 須要 jdk 7
 

2.3 修改配置文件

HDFS 相關的配置文件是${HADOOP_HOME}/etc/hadoop/下的 hdfs-site.xml,爲了便於管 理,一般讓 HDFS 上各個節點上的 hdfs-site.xml 一致。
配置 HDFS HA,需對一下參數設置:
 

(1) dfs.nameservices

HDFS 命名服務的邏輯名稱,可用戶本身定義,好比 mycluster,注意,該名稱將被基 於 HDFS 的系統使用,好比 Hbase 等,此外,須要你想啓用 HDFS Federation,能夠經過該 參數指定多個邏輯名稱,並用「,」分割。

2.2 硬件選擇及軟件準備

(1) 硬件選擇

 

 NameNode 機器:推薦主備 NameNode 具備相同的硬件配置,且內存要足夠大。session

 JournalNode:一般準備 3 或 5 個 JournalNode,考慮到 JournalNode 很是輕量級,能夠與 Hadoop 其餘服務共用機器,好比 ResourceManager,TaskTracker 等。架構

 Zookeeper:因爲 Hadoop 多個服務用到了 Zookeeper,可搭建一個 3 或者 5 個節點的Zookeeper 實例做爲公共服務。Zookeeper 實例也能夠與其餘服務共用機器。ssh

(2) 軟件準備

  Apache Hadoop 2.2.0 或者更高版本,或 cdh4 以及更高版本
 
  JDK 1.6 或者更高版本,注意,cdh5 須要 jdk 7
 

2.3 修改配置文件

HDFS 相關的配置文件是${HADOOP_HOME}/etc/hadoop/下的 hdfs-site.xml,爲了便於管 理,一般讓 HDFS 上各個節點上的 hdfs-site.xml 一致。
配置 HDFS HA,需對一下參數設置:
 

(1) dfs.nameservices

HDFS 命名服務的邏輯名稱,可用戶本身定義,好比 mycluster,注意,該名稱將被基 於 HDFS 的系統使用,好比 Hbase 等,此外,須要你想啓用 HDFS Federation,能夠經過該 參數指定多個邏輯名稱,並用「,」分割。
 

2.2 硬件選擇及軟件準備

(1) 硬件選擇

 

 NameNode 機器:推薦主備 NameNode 具備相同的硬件配置,且內存要足夠大。

 JournalNode:一般準備 3 或 5 個 JournalNode,考慮到 JournalNode 很是輕量級,能夠與 Hadoop 其餘服務共用機器,好比 ResourceManager,TaskTracker 等。

 Zookeeper:因爲 Hadoop 多個服務用到了 Zookeeper,可搭建一個 3 或者 5 個節點的Zookeeper 實例做爲公共服務。Zookeeper 實例也能夠與其餘服務共用機器。

(2) 軟件準備

  Apache Hadoop 2.2.0 或者更高版本,或 cdh4 以及更高版本
 
  JDK 1.6 或者更高版本,注意,cdh5 須要 jdk 7
 

2.3 修改配置文件

HDFS 相關的配置文件是${HADOOP_HOME}/etc/hadoop/下的 hdfs-site.xml,爲了便於管 理,一般讓 HDFS 上各個節點上的 hdfs-site.xml 一致。
配置 HDFS HA,需對一下參數設置:
 

(1) dfs.nameservices

HDFS 命名服務的邏輯名稱,可用戶本身定義,好比 mycluster,注意,該名稱將被基 於 HDFS 的系統使用,好比 Hbase 等,此外,須要你想啓用 HDFS Federation,能夠經過該 參數指定多個邏輯名稱,並用「,」分割。
 
<property>  
 <name>dfs.nameservices</name>   
<value>nn</value>  
<description>Logical name for this new nameservice</description>   
</property> 

hdfs-federation配置,可同時有多個namenode服務:

<property>  
 <name>dfs.federation.nameservices</name>   
<value>nn1,nn2</value>  
<description>Logical name for this new nameservice</description>   
</property> 

 

(2) dfs.ha.namenodes.[$nameservice ID]:

某個命名服務下包含的 NameNode 列表,可爲每一個 NameNode 指定一個自定義的 ID 名稱,好比命名服務 nn 下有兩個 NameNode,分別命名爲 nn1 和 nn2,則配置以下:

<property>  
  <name>dfs.ha.namenodes.nn</name>   
  <value>nn1,nn2</value>  
  <description>Unique identifiers for each NameNode in the nameservice </description>  
</property>  

注意,目前每一個命名服務最多配置兩個 NameNode

 

(3) dfs.namenode.rpc-address.[$nameservice ID].[$name node ID]

爲每一個 NameNode 設置 RPC 地址,之前面的實例爲例,可進行以下配置:

<property>   
<name>dfs.namenode.rpc-address.nn.nn1</name>  
 <value>nn1:9000</value>  
</property>  
 <property>  
<name>dfs.namenode.rpc-address.nn.nn2</name>  
<value>nn2:9000</value>   
</property>  

(4) dfs.namenode.http-address.[$nameservice ID].[$name node ID]

爲每一個 NameNode 設置對外的 HTTP 地址,之前面的實例爲例,可進行以下配置:

<property>   
<name>dfs.namenode.http-address.nn.nn1</name>   
<value>192.168.10.110:50070</value>  
</property>  
<property>  
<name>dfs.namenode.http-address.nn.nn2</name>  
<value>192.168.10.111:50070</value>  
</property>  

(5) dfs.namenode.shared.edits.dir

設置一組 journalNode 的 URI 地址,active NameNode 將 edit log 寫入這些JournalNode,而 standby NameNode 讀取這些 edit log,並做用在內存中的目錄樹中,該屬性 值應符合如下格式:

qjournal://host1:port1;host2:port2;host3:port3/journalId  

其中,journalId 是該命名空間的惟一 ID。假設你有三臺 journalNode,即 dn1, dn2 和 dn3,則可進行以下配置:

<property>  
<name>dfs.namenode.shared.edits.dir</name>  
<value>qjournal://dn1:8485;dn2:8485; dn3:8485;dn4:8485;dn6:8485/nn</value>  
</property>  

注意,JournalNode 默認端口號爲 8485

(6) dfs.client.failover.proxy.provider.[$nameservice ID]

設置客戶端與 active NameNode 進行交互的 Java 實現類,DFS 客戶端經過該類尋找當前的 active NameNode。該類可由用戶本身實現,默認實現爲 ConfiguredFailoverProxyProvider。

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

(7) dfs.ha.fencing.methods

主備架構解決單點故障問題時,必需要認真解決的是腦裂問題,即出現兩個 master 同時對外提供服務,致使系統處於不一致狀態,可能致使數據丟失等潛在問題。在 HDFS HA 中,JournalNode 只容許一個 NameNode 寫數據,不會出現兩個 active NameNode 的問題, 可是,當主備切換時,以前的 active NameNode 可能仍在處理客戶端的 RPC 請求,爲此, 須要增長隔離機制(fencing)將以前的 active NameNode 殺死。
HDFS 容許用戶配置多個隔離機制,當發生主備切換時,將順次執行這些隔離機制,直 到一個返回成功。Hadoop 2.0 內部打包了兩種類型的隔離機制,分別是 shell 和 sshfence。
 
1) sshfence
sshfence 經過 ssh 登陸到前一個 active NameNode 並將其殺死。爲了讓該機制成功執行,
需配置免密碼 ssh 登錄,這可經過參數 dfs.ha.fencing.ssh.private-key-files 設置一個私鑰文件。
<property>  
<name>dfs.ha.fencing.methods</name>  
<value>sshfence</value>  
</property>  
<property>  
<name>dfs.ha.fencing.ssh.private-key-files</name>  
<value>/home/hadoop/.ssh/id_rsa</value>  
</property>  

你能夠配置一個 ssh 用戶和端口號,並設置一個超時時間,一旦 ssh 超過該時間,則認爲執 行失敗。

<property>  
<name>dfs.ha.fencing.methods</name>  
<value>sshfence([[username][:port]])</value>  
</property>  
<property>  
<name>dfs.ha.fencing.ssh.connect-timeout</name>  
<value>30000</value>  
</property>  

2) shell
執行任意一個 shell 命令隔離舊的 active NameNode,配置方法以下:

<property>  
<name>dfs.ha.fencing.methods</name>  
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>  (這裏沒搞懂)  
</property>  

注意,Hadoop 中全部參數將以環境變量的形似提供給該 shell,但全部的「.」被替換成了「_」, 好比「dfs.namenode.rpc-address.ns1.nn1」變爲「dfs_namenode_rpc-address」

 

(8) fs.defaultFS

設置缺省的目錄前綴,需在 core-site.xml 中設置,好比命名服務的 ID 爲 mycluster(參 數 dfs.nameservices 指定的),則配置以下:

<property>  
<name>fs.defaultFS</name>  
<value>hdfs://nn</value>  
</property>  

(9) dfs.journalnode.edits.dir

JournalNode 所在節點上的一個目錄,用於存放 editlog 和其餘狀態信息。該參數只能設置一個目錄,你能夠對磁盤作 RIAD 提升數據可靠性。

<property>  
<name>dfs.journalnode.edits.dir</name>  
<value>/opt/journal/node/local/data</value>  
</property>  

 

2.4 啓動服務

假設 nn1 和 nn2 兩個節點是主備 NameNode,則 HDFS 集羣啓動順序以下:
(1) 啓動全部 JournalNode
(2) 啓動 nn1 和 nn2
(3) 啓動全部 DataNode
步驟 1:啓動全部 JournalNode
在全部 JournalNode 節點上,進入 Hadoop 安裝目錄下,運行如下命令啓動
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. sbin/hadoop-daemon.sh start journalnode  
步驟 2:初始化 JournalNode 在 nn1 上,執行如下命令:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. hdfs namenode -initializeSharedEdits [-force | -nonInteractive]  

該命令將格式化各個 JournalNode,默認狀況下是交互式執行的,要求用戶輸入「Y/N」進行確 認,可使用參數-force 或者 –nonInteractive 跳過交互式過程,直接強制格式化。
 
步驟 3:啓動 nn1 和 nn2
(1) 啓動nn1
ps:新的hdfs集羣記得 hdfs  namenode  -format 格式化
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. sbin/hadoop-daemon.sh start namenode  
(2)啓動 nn2
讓 nn2 從 nn1 上拉取最新的 FSimage:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. bin/hdfs namenode -bootstrapStandby [-force | -nonInteractive]  
啓動 nn2:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. sbin/hadoop-daemon.sh start namenode  
步驟 4:啓動全部 DataNode
在各個 DataNode 節點上執行如下命令:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. sbin/hadoop-daemon.sh start datanode  
或者,直接在 nn1 上執行一條命令:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. sbin/hadoop-daemons.sh start datanode  
在 Web 界面上查看是否啓動成功,若是界面顯示以下(standby namenode 的界面),則啓動 成功:
 
步驟 5:將 NN1 狀態切換爲 Active
(1) 人工切換
nn1 和 nn2 啓動後,都處於 Standby 狀態,此時均不能對外提供服務,在 nn1 節點上輸入 如下命令將它切換爲 active:
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. hdfs haadmin -failover --forcefence --forceactive <serviceId<serviceId>  

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. 就會把NameNode的狀態進行安全的切換。其中後面一個會變爲active狀態。這時候再經過web頁面觀察就能看到正確結果了。  

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. hdfs haadmin -failover --forcefence --forceactive nn1 nn2  
[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. 執行命令「hdfs  haadmin」,會顯示子命令列表,以下  
  2.   
  3.   
  4.   
  5. Usage: DFSHAAdmin [-ns <nameserviceId>]  
  6.   
  7.     [-transitionToActive <serviceId>]  
  8.   
  9.     [-transitionToStandby <serviceId>]  
  10.   
  11.     [-failover [--forcefence] [--forceactive] <serviceId<serviceId>]  
  12.   
  13.     [-getServiceState <serviceId>]  
  14.   
  15.     [-checkHealth <serviceId>]  
  16.   
  17.     [-help <command>]<span style="white-space:pre">                                                                                                                     </span>        經過help能夠看到,也能夠用hdfs  haadmin  -transitionToActive  nn1 進行切換namenode到active狀態<span style="white-space:pre">                                                                                        </span>  

(2) 自動切換
當 active namenode 發生故障時,人工切換模式不能自動完成主備切換,所以推薦使用自動切換,這是基於 zookeeper 實現的,具體配置可參考下一節2.5。
 

2.5 配置自動切換模式

HDFS NameNode 自動切換由如下兩個組件構成:
 Zookeeper 實例(3 個或 5 個或 7 個節點)
 ZKFailoverController(簡稱「ZKFC」)
ZKFC 是一個 Zookeeper 客戶端,負責監控和管理 NameNode 的狀態,每臺運行 NameNode 的機器上也會運行一個 ZKFC 進程。
 健康情況監控:ZKFC週期性地與本地的NameNode交互,執行一些健康情況監測命令。  Zookeepersession管理:若是本地NameNode是健康的,則會持有Zookeeper上一個znode, 若是它是 active 的,會持有 zookeeper 的僅有的一個特殊 znode,該 znode 類型爲 ephemeral,一旦 namenode 掛掉後,會自動消失。
 基於zookeeper的選舉:若是本地NameNode是活的,而沒有其餘namenode持有特殊的znode,
ZKFC 將嘗試獲取這個 znode,一旦獲取成功後,則認爲它「贏得了選舉」,進而隔離以前的 active namenode,本身轉換爲新的 active namenode。
 
 
具體步驟以下: 注:如下操做在集羣關閉狀況下進行
 
 步驟 1:修改配置文件
(1) 開啓自動切換模式
在 hdfs-site.xml 增長如下配置:
(2) 配置 zookeeper 實例地址
在 core-site.xml 中,增長如下配置:

<property>
 <name>dfs.ha.automatic-failover.enabled</name> 
<value>true</value>
</property>

<property>
<name>ha.zookeeper.quorum</name>
<value>dn1:2181,dn2:2181, dn3:2181, dn4:2181,dn6:2181</value>
</property

步驟 2:初始化 zookeeper
bin/hdfs zkfc -formatZK
步驟 3:啓動 JournalNode、NameNode 和 DataNode 
 
步驟 4:啓動 ZKFC
在各個 NameNode 上,依次輸入如下命令啓動 ZKFC:
sbin/hadoop-daemon.sh start zkfc
第一個啓動的 NN 將成爲 active NameNode
步驟 5:驗證自動切換功能是否生效
可人工將 active namenode 進程殺死,看是夠自動切換到另外一個 namenode。
 
原文地址:http://pan.baidu.com/share/link?shareid=3918641874&uk=2248644272
相關文章
相關標籤/搜索