Hadoop 2.x HDFS新特性


Hadoop 2.x HDFS新特性     

   1.HDFS聯邦 
   2. HDFS HA(要用到zookeeper等) 
   3.HDFS快照 

回顧: HDFS兩層模型 
    Namespace: 包括目錄、文件和塊。它支持所有命名空間相關的文件操作,如創建、刪除、修改,查看所有文件和目錄。 
    Block Storage Service(塊存儲服務) 包括兩部分: 
1 在namenode中的塊的管理:提供datanode集群的注冊、心跳檢測等功能。處理塊的報告信息和維護塊的位置信息。支持塊相關的操作,如創建、刪除、修改、獲取塊的位置信息。管理塊的冗余信息、創建副本、刪除多余的副本等。 
2 存儲: datanode提供本地文件系統上塊的存儲、讀寫、訪問等。 

 



1.x HDFS架構的弱點 
    HDFS架構在整個集群中允許且僅允許一個單獨的命名空間。命名空間被一個單獨的namenode節點所管理。這種架構決策實現簡單。但也會產生單點,內存瓶頸,性能瓶頸等限制。 

1.1 命名空間管理

HDFS的命名空間包含目錄、文件和塊。命名空間管理:是指命名空間支持對HDFS中的目錄、文件和塊做類似文件系統的創建、修改、刪除、列表文件和目錄等基本操作。

 

1.2 塊/存儲管理

在塊存儲服務中包含兩部分工作:塊管理和物理存儲。這是一個更通用的存儲服務。其他的應用可以直接建立在Block Storage上,如HBase,Foreign Namespaces等。

 

1.2.1 塊管理

A) 處理Data Node向Name Node注冊的請求,處理datanode的成員關系,處理來自Data Node周期性的心跳。

B) 處理來自塊的報告信息,維護塊的位置信息。

C) 處理與塊相關的操作:塊的創建、刪除、修改及獲取塊信息。

D) 管理副本放置(replica placement)和塊的復制及多余塊的刪除。

 

1.2.2 物理存儲

所謂物理存儲就是:Data Node把塊存儲到本地文件系統中,對本地文件系統的讀、寫。

 

1.3 當前HDFS的架構

在當前的HDFS架構中(Hadoop v0.23之前),在整個HDFS集群中只有一個命名空間,並且只有單獨的一個Name Node,這個Name Node負責對這單獨的一個命名空間進行管理。這也正是單點失效(Single Point Failure)的隱患所在。本文所講的HDFS Federation就是針對當前HDFS架構上的缺陷所做的改進,簡單說HDFS Federation就是使得HDFS支持多個命名空間,並且允許在HDFS中同時存在多個Name Node。

簡單回顧一下目前HDFS的架構,如下圖所示。在整個HDFS集群中只有一個Namenode,還有一個Backup Namenode。Namenode會實時將變化的HDFS的信息同步給Backup Namenode。Backup Namenode顧名思義是用來做Namenode的備份的。Namenode中命名空間以層次結構組織中存儲着文件名和BlockID的對應關系、BlockID和具體Block位置的對應關系。這個單獨的Namenode管理着數個Datanode,Block分布在各個Datanode中,每個Datanode會周期性的向此Namenode發送心跳消息,報告自己所在Datanode的使用狀態。Block是用來存儲數據的最小單元,通常一個文件會存儲在一個或者多個Block中,默認Block大小為64MB。

 



HDFS聯邦 
    目的:水平擴展名稱服務 
    使用多個獨立的namenode和namespaces。每個namenode是獨立的,不需要和其它namenode協調合作。 
    datanode作為統一的塊存儲設備被所有namenode節點使用。 
    每一個datanode節點都在所有的namenode進行注冊。 datanode發送心跳信息、塊報告到所有namenode,同時執行所有namenode發來的命令。 

 



塊池( Block Pool) 
    塊池是屬於單個命名空間的一組塊。 
    每一個datanode為所有的block pool存儲塊。 
    Datanode是一個物理概念,而block pool是一個重新將block划分的邏輯概念。 
    同一個datanode中可以存着屬於多個block pool的多個塊。 
    Block pool允許一個命名空間在不通知其他命名空間的情況下為一個新的block創建Block ID。 
    一個Namenode失效不會影響其下的datanode為其他Namenode的服務。 

HDFS聯邦的好處 
    Namespace的可擴展性, 1.x中集群存儲可以水平擴展(增加節點),但namespace不可以。 
    1.x的Namenode 存在單點瓶頸,在2.x中可以通過增加 namenode解決 
    隔離性。在1.x中,一個拙劣的應用可能耗盡namenode的性能資源從而影響其他應用運行, 2.x的多namenode可以將不同類型的應用和用戶隔離在不同的namespaces 

命名空間管理細節 
    https://issues.apache.org/jira/secure/attachment/12453067/high-leveldesign.pdf 
    不采用文件名Hash這一在分布式系統里常用的手段,因為同一目錄下的文件可能散布於各個命名空間,性能很差 
    采用Client Side Mount Table,如下圖 

 


聯邦未解決問題 
    並非真正HA, namenode失效會造成部分數據無法訪問 
    負載均衡難以自勱完成 

HDFS快照 
    在2.x終於實現了快照 
    設置一個目錄為可快照: 
        hdfs dfsadmin -allowSnapshot <path> 
    取消目錄可快照: 
        hdfs dfsadmin -disallowSnapshot <path> 
    生成快照: 
        hdfs dfs -createSnapshot <path> [<snapshotName>] 
    刪除快照: 
        hdfs dfs -deleteSnapshot <path> <snapshotName> 

快照位置 
    可快照目錄下的.snapshot子目錄 

其它快照操作 
    列出所有可快照目錄: 
        hdfs lsSnapshottableDir 
    比較快照之間的差異: 
        hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot> 

轉:http://my.oschina.net/zc741520/blog/366700

詳細可以查看這里:

 雲計算(十一)- HDFS快照(HDFS Snapshots)

 

HDFS HA功能簡介及配置

Hadoop 0.23.2版本之前, NameNode是HDFS集群的單點故障點,每一個集群只有一個NameNode,如果這個機器或進程不可用,整個集群就無法使用,直到重啟NameNode或者新啟動一個NameNode節點。
影響HDFS集群不可用主要包括以下兩種情況:
1、第一種情況是如機器宕機這樣的意外情況,將導致集群不可用,只有在重啟NameNode之后才可使用。
2、第二種情況是計划內的軟件或硬件升級(NameNode節點),將導致集群在短時間范圍內不可用。
HDFS的HA就是為了解決上述問題,通過提供選擇運行在同一集群中的一個熱備用的“主/備”兩個冗余NameNodes。這允許在機器宕機或系統維護的時候,快速的轉移到另一個NameNode.
 
 
一個典型的HA集群,兩個單獨的機器配置為NameNodes,在任何時候,一個NameNode處於活動狀態,另一個處於待機狀態,活動的NameNode負責處理集群中所有客戶端的操作,待機時僅僅作為一個slave,保持足夠的狀態,如果有必要提供一個快速的故障轉移.
為了保持備用節點與活動節點狀態的同步,目前的實現需要兩個節點同時訪問一個共享存儲設備(例如從NASNFS掛載)到一個目錄。將有可能在未來的版本中放寬此限制。
當活動節點對命名空間進行任何修改,它將把修改記錄寫到共享目錄下的一個日志文件,備用節點會監聽這個目錄,當發現更改時,它會把修改內容同步到自己的命名空間。備用節點在故障轉移時,它將保證已經讀取了所有共享目錄內的更改記錄,保證在發生故障前的狀態與活動節點保持完全一致。
為了提供快速的故障轉移,必須保證備用節點有最新的集群中塊的位置信息,為了達到這一點,Datanode節點需要配置兩個nameNode的位置,同時發送塊的位置信息和心跳信息到兩個nameNode。
任何時候只有一個namenode處於活動狀態,對於HA集群的操作是至關重要的,否則兩個節點之間的狀態就會產生沖突,數據丟失或其它不正確的結果,為了達到這個目的或者所謂的“裂腦場景”出現,管理員必須為共享存儲配置至少一個(fencing)方法。在宕機期間,如果不能確定之間的活動節點已經放棄活動狀態,fencing進程負責中斷以前的活動節點編輯存儲的共享訪問。這可以防止任何進一步的修改命名空間,允許新的活動節點安全地進行故障轉移。
注:目前,只有手動故障轉移支持。這就意味着HA nameNode不能自動檢測活動nameNode的失敗,而是通過手動啟動故障轉移。自動故障檢測和故障轉移將在未來的版本中實現。
 
硬件資源
為了部署一個HA集群環境,您需要准備以下資源:
NameNode 機器:運行活動節點和備用節點的機器和非HA環境的機器需要有同相的硬件配置。
共享存儲:您需要有一個主備namenode節點都是可讀寫的共享目錄,通常情況,這是一個遠程的文件管理器,它支持使用NFS掛載到每個namenode節點。目前只支持一個可編輯目錄。因此,系統的是否可用將受限於共享目錄是否可用,因此,為了消除所有單點故障,需要對共享目錄再加冗余,具體來說,多個網絡路徑的存儲需要實現存儲系統自身的冗余。因為這個原因,建議共享存儲服務器是一個高品質的專用NAS設備,而不是一個簡單的Linux服務器。
注:在HA集群環境里,備用的namenode還要執行檢測命名空間的狀態,因此,沒有必要再運行Secondary NameNode,CheckpointNode,BackupNode。事實上,這樣做將會報錯,這也允許在從非集群環境到集群環境的重新配置時,重新利用之前的Secondary NameNode的硬件資源。
 
部署
配置簡介
類似聯邦配置,HA配置向后兼容,允許在不改變當前單節點的情況下配置成集群環境,新的配置方案確保了在集群環境中的所有節點的配置文件都是相同的,沒有必要因為節點的不同而配置不同的文件。
和聯邦配置一樣,HA集群環境重復使用名稱服務ID來確定一個單一的HDFS實例,實際上可能包括多個HA namenodes.此外,一個新的namenode增加到HA,集群中的每一個nameNode都有一個不同的ID來標識它,為了支持所有namenode有同一個配置文件,所有的配置參數都以命名服務ID和nameNodeID為后綴。
 
詳細配置
 
    配置HA nameNodes,您需要增加一些配置選項到 hdfs-site.xml 配置文件。
 
    這些配置選項的順序不重要,但dfs.federation.nameservices和dfs.ha.namenodes.[nameservice ID]的值將決定下面配置的Key值。因此,在配置其它選項前,需要確定這兩個選項的值。
 
dfs.federation.nameservices一個新的名稱服務的邏輯名稱。為名稱服務選擇一個邏輯名稱,如“mycluster”,使用這個邏輯名稱作為這個配置項的值。這個名稱可以是隨意的,它將用於配置和集群環境中HDFS絕對路徑的認證組件。
注:如果您還使用HDFS聯邦,這個配置項應該包括其它的名稱服務列表,HA或者其它,用逗號進行分隔。
<property>
 <name>dfs.federation.nameservices</name>
  <value>mycluster</value>
</property>
dfs.ha.namenodes.[nameservice ID]在名稱服務中每一個nameNode的唯一標識符
    配置一個逗號分隔的NameNode的ID的列表,DataNode會用它來確定在集群中的所有namenode.如我們前面使用"mycluster"作為我們名稱服務的ID,你如果使用nn1和nn2作為namenode的ID,你應該這樣配置:
<property>
 <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
    注:當前一個名稱服務最多只允許配置兩個namenode。
dfs.namenode.rpc-address.[nameservice ID].[name node ID]每一個namenode監聽的標准RPC地址
對於前面配置的兩個namenode的ID,設置namenode節點詳細的地址和端口,注意,這個配置項將在兩個單獨的配置項里配置,如:
<property>
 <name>dfs.namenode.rpc-address.mycluster.nn1</name>
 <value>machine1.example.com:8020</value>
</property>
<property>
 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
 <value>machine2.example.com:8020</value>
</property>
注:如果你願意,你可以配置相同的RPC地址。
dfs.namenode.http-address.[nameservice ID].[namenode ID]每一個namenode監聽的標准HTTP地址
和RPC地址一樣,設置兩個namenode監聽的http地址,如:
<property>
 <name>dfs.namenode.http-address.mycluster.nn1</name>
 <value>machine1.example.com:50070</value>
</property>
<property>
 <name>dfs.namenode.http-address.mycluster.nn2</name>
 <value>machine2.example.com:50070</value>
</property>
    注:如果你啟用了hadoop的安全功能,你也可以同樣設置成https地址。
dfs.namenode.shared.edits.dir共享存儲目錄的位置
這是配置備份節點需要隨時保持同步活動節點所作更改的遠程共享目錄,你只能配置一個目錄,之個目錄掛載到兩個namenode上都必須是可讀寫的,且必須是絕對路徑。如:
<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>
</property>
dfs.client.failover.proxy.provider.[nameserviceID]HDFS客戶端用來和活動的namenode節目聯系的java類
    配置的java類是用來給HDFS客戶端判斷哪個namenode節點是活動的,當前是哪個namenode處理客戶端的請求,當前hadoop唯一的實現類是ConfiguredFailoverProxyProvider,除非你自己定義了一個類,否則都將使用這個類。如:
<property>
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
dfs.ha.fencing.methods將用於停止活動NameNode節點的故障轉移期間的腳本或Java類的列表
    任何時候只有一個namenode處於活動狀態,對於HA集群的操作是至關重要的,因此,在故障轉移期間,在啟動備份節點前,我們首先要確保活動節點處於等待狀態,或者進程被中止,為了達到這個目的,您至少要配置一個強行中止的方法,或者回車分隔的列表,這是為了一個一個的嘗試中止,直到其中一個返回成功,表明活動節點已停止。hadoop提供了兩個方法:shell和sshfence,要實現您自己的方法,請看org.apache.hadoop.ha.NodeFencer類。
sshfence 通過ssh連接活動namenode節點,殺掉進程
為了實現SSH登錄殺掉進程,還需要配置免密碼登錄的SSH密匙信息,如下所示:
<property>
 <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
 
<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/home/exampleuser/.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>34</value>
</property>
shell -執行任意的shell命令來終止活動namenode節點
    配置如下:
<property>
 <name>dfs.ha.fencing.methods</name>
  <value>shell(/path/to/my/script.sh arg1arg2 ...)</value>
</property>
    shell腳本將會運行在包括所有hadoop配置參數變量的環境中,只需將配置key的.換成_即可。如dfs_namenode_rpc-address。除此之外,還包括以下的變量:
$target_host
需要中止的服務器hostname
$target_port
需要中止的服務器端口
$target_address
上面兩個參數的組合
$target_nameserviceid
需要中止的名稱服務ID
$target_namenodeid
需要中止的namenode的ID
這些變量也可以直接在shell腳本中使用,如:
<property>
 <name>dfs.ha.fencing.methods</name>
  <value>shell(/path/to/my/script.sh--nameservice=$target_nameserviceid $target_host:$target_port)</value>
</property>
如果腳本返回0表示中止成功,返回其它值表示失敗,同時將嘗試列表中的其它中止方法。
注:這個方法沒有實現超時設置,所有超時設置都取決於腳本自身。
fs.defaultFS當FS客戶端沒有設置時的默認路徑的前綴
另外,您可以配置為hadoop客戶端配置HA集群的URI作為默認路徑。如果你使用"mycluster"作為名稱服務ID,那么在core-site.xml文件中將配置為:
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
 
部署詳情
 
    所有配置完成后,最初必須同步兩個HAnamenode磁盤上的元數據。如果您是全新安裝一個HDFS集群,那么您需要在其中一個namenode運行格式化命令(hdfsnamenode -format),如果你已經格式化過namenode或者是從一個非HA環境轉換到HA環境,那么你需要使用scp或類似的命令把namenode上的元數據目錄復制到另一個namenode。通過配置 dfs.namenode.name.dir 和 dfs.namenode.edits.dir兩個選項到包含namenode元數據目錄的位置。在這個時候,你必須保證之前配置的共享目錄包括在您namenode元數據目錄下的最近的編輯文件信息。
 
    然后,您可以和平時啟動namenode一樣,啟動兩個HA namenode。
 
    您可以通過配置的HTTP web地址訪問兩個namenode,你會看到兩個HAnamenode當前的狀態(主/備),當namenode啟動的時候,它的最被狀態都是“備”狀態。
 
管理命令
 
    現在完成了配置和啟動,你可以執行其它的命令來管理你的HA集群。具體來說,你應該熟悉所有hdfs haadmin下的所有命令。不加任何參數的情況下,將顯示如下信息:
Usage: DFSHAAdmin [-ns<nameserviceId>]
    [-transitionToActive<serviceId>]
    [-transitionToStandby<serviceId>]
    [-failover [--forcefence][--forceactive] <serviceId> <serviceId>]
    [-getServiceState<serviceId>]
    [-checkHealth<serviceId>]
    [-help <command>]


    本指南將介紹這此子命令的高級別用法,每個命令的詳細使用幫助,您可以運行如下命令來查看:
hdfs haadmin -help<command>
transitionToActive 和transitionToStandby就是把指定的namenode轉換到主/備狀態。
    注:這個命令把指定的namenode轉換到主/備狀態,但這個命令不會試圖去停止活動節點,所以,盡量少使用它,可以使用hdfs haadmin -failover來代替。
    failover - 在兩個namenode之間做故障轉移。
此命令將會把故障從第一個轉移到第二個namenode,如果第一個namenode是“備”狀態,這個命令會成功的將第二個namenode轉換到“主”狀態,如果第一個namenode是“主”狀態,它將會嘗試把它轉換到“備”狀態,它會使用    在之前配置的 dfs.ha.fencing.methods 所有方法列表中從第一個開始,只到成功為止,它才會把第二個namenode轉換成“主”狀態。如果所有方法都不能把第一個namenode轉換到“備”狀態,那么第二個namenode也不能轉換成“主”狀態,它將返回一個錯誤信息。
getServiceState - 獲取指定namenode的狀態。
    連接到指定的namenode去確定它當前的狀態,並打印出出它的狀態(主或備)。根據namenode不同的狀態,這個命令會使用cron作業或監控腳本來執行。
checkHealth - 檢查指定namenode的健康狀態。
    連接到指定的namenode去檢查它的健康狀態,namenode能夠對自身進行一些診斷,包括檢查內部服務是否按預期運行。如果namenode運行正常,它將返回0,否則返回非0的值。這個命令的唯一用途就是進行監測。
注: 當前這個命令還沒有實現, 除非namenode完成宕機,否則它總是返回成功.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM