HDFS架構指南(分佈式系統Hadoop的文件系統架構)

HDFS架構指南

筆者之前爲了寫一篇綜述,翻譯了一些材料,爲了符合原始的意思,我保留了一些英文,翻譯的時候真的很辛苦,現在在博客裏分享給大家啦!

本文翻譯自《HDFS Architecture Guide》
來源於Apache開源社區的Hadoop Apache Project
文獻引用爲:

Borthakur D. HDFS architecture guide[J]. Hadoop Apache Project,2008,53: 1-13

作者:Dhruba Borthakur

目錄

1 介紹
2 假設和目標
2.1 硬件故障
2.2 流數據訪問
2.3 大數據集
2.4 簡單一致性模型
2.5 “移動計算比移動數據便宜”
2.6 異構硬件和軟件平臺的可移植性
3 NameNode和DataNodes
4 文件系統命名空間
5 數據複製
5.1 複製品放置:第一個嬰兒步驟
5.2 副本選擇
5.3 安全模式
6 文件系統元數據的持久性
7 通信協議
8 穩健性
8.1 數據磁盤故障,心跳和重新複製
8.2 集羣重新平衡
8.3 數據完整性
8.4 元數據磁盤故障
8.5 快照
9 數據組織
9.1 數據塊
9.2 分期
9.3 複製流水線
10 可訪問性
10.1 FS shell
10.2 DFSAdmin
10.3 瀏覽器接口
11 空間回收
11.1文件刪除與取消刪除
11.2減少複製因子
12 參考

1 Introduction

Hadoop分佈式文件系統(HDFS)是一個旨在運行在商品硬件上的分佈式文件系統。 它與現有的分佈式文件系統有許多相似之處。但是,與其他分佈式文件系統的差異很大。 HDFS具有高度容錯能力,旨在部署在低成本硬件上。 HDFS提供高吞吐量訪問應用程序數據,適用於具有大型數據集的應用程序。HDFS放寬了一些POSIX要求,以實現對文件系統數據的流式訪問。HDFS最初是作爲Apache Nutch網絡搜索引擎項目的基礎設施而構建的。HDFS現在是Apache Hadoop子項目。 項目網址是 http://hadoop.apache.org/hdfs / 。

2 Assumptions and Goals

2.1 Hardware Failure

硬件故障是常態而非例外。 HDFS實例可能包括數百或數千臺服務器機器,每臺服務器機器存儲文件系統數據的一部分。存在大量組件並且每個組件都有一個非常重要的失敗概率,意味着HDFS的某些組成部分始終無法正常運行。因此,故障檢測並從中快速自動恢復是核心架構HDFS的目標。

2.2 Streaming Data Acess

在HDFS上運行的應用程序需要對其數據集進行流式訪問。 他們不是一般的通常在通用文件系統上運行的目的應用程序。 HDFS的設計更多用於批處理而不是用於用戶的交互式使用。 重點是高數據訪問的吞吐量而不是數據訪問的低延遲。 POSIX強加許多針對HDFS的應用程序不需要的硬性要求。 POSIX已經交換了幾個關鍵領域的語義以提高數據吞吐率。

2.3 Large Data Sets

在HDFS上運行的應用程序具有大型的數據集。 HDFS中的典型文件是千兆字節太字節大小( gigabytes to terabytes in size)。 因此,HDFS被調整爲支持大文件。 它應該提供高聚合數據帶寬並擴展到單個集羣中的數百個節點。 它應該在單個實例中支持數千萬個文件。

2.4 Simple Coherency Model 簡單一致性模型

HDFS應用程序需要一個一次寫入多次讀取的文件訪問模型。 文件一旦創建,寫入,關閉不需要改變。 該假設簡化了數據一致性問題並實現高吞吐量數據訪問。 MapReduce應用程序或Web爬網程序應用程序完全適合此模型。 有計劃在將來支持對文件的追加寫入。

2.5 “Moving Computation is Cheaper than Moving Data”

如果在它運作的數據附近執行,則應用程序請求的計算效率更高。 當數據集的大小很大時尤其如此。 這個最大限度地減少網絡擁塞並提高系統的整體吞吐量。 該假設通常更好地將計算遷移到更接近數據的位置找到而不是將數據移動到運行應用程序的位置。 HDFS爲應用程序提供接口來移動它們自己,以便到達更靠近數據所在的位置。

2.6 Portability Across Heterogeneous Hardware and Software Platforms

HDFS的設計便於從一個平臺移植到另一個平臺。 這有利於廣泛採用HDFS作爲大量應用程序的首選平臺。

3 NameNode and DataNodes

HDFS具有主/從架構。 HDFS集羣由單個的NameNode,管理文件系統命名空間的主服務器(master server),用於管理對文件的訪問客戶端(client);此外,還有許多DataNode,通常是集羣中每個節點一個,它管理附加到它們運行的節點的存儲。 HDFS公開文件系統命名空間並允許用戶數據存儲在文件中。 在內部,文件被拆分爲一個或更多塊,這些塊存儲在一組DataNode中。 NameNode執行文件系統命名空間操作,如打開,關閉和重命名文件和目錄;它還確定了塊到DataNode的映射。 DataNodes負責提供來自文件系統客戶端的讀寫請求。 DataNode還根據NameNode的指令執行塊創建,刪除和複製。

Hadoop的HDFS體系結構
NameNode和DataNode是設計用於運行在商業機器上的軟件。 這些機器通常運行GNU / Linux操作系統(OS)。 HDFS是使用Java語言構建; 任何支持Java的機器都可以運行NameNode或DataNode軟件。 使用高度可移植的Java語言意味着HDFS可以部署在各種機器上。 典型部署具有專用機器只運行NameNode軟件。 羣集中的每臺其他計算機都運行一臺DataNode軟件的實例。 該體系結構不排除運行多個DataNodes位於同一臺計算機上,但在實際部署中很少出現這種情況。集羣中存在單個NameNode極大地簡化了集羣的體系結構系統。 NameNode是所有HDFS元數據的仲裁者和存儲庫。 該系統是以這樣的方式設計,即用戶數據永遠不會流經NameNode。

4 The File System Namespace

HDFS支持傳統的分層文件組織。 用戶或應用程序可以創建這些目錄中的目錄和存儲文件。 文件系統命名空間層次結構是類似於大多數其他現有文件系統; 可以創建和刪除文件,從中移動文件一個目錄到另一個目錄,或重命名文件。 HDFS尚未實現用戶配額。 HDFS不支持硬鏈接或軟鏈接。 但是,HDFS架構並不排除實現這些功能。NameNode維護文件系統名稱空間。 對文件系統的任何更改命名空間或其屬性由NameNode記錄。 應用程序可以指定應由HDFS維護的文件的副本數。 a的副本數量file被稱爲該文件的複製因子。 該信息由NameNode存儲。

5 Data Replication

HDFS旨在跨大型集羣中的計算機可靠地存儲非常大的文件。 它存儲每個文件作爲一系列塊; 除最後一個塊之外的文件中的所有塊都具有相同的大小。複製文件的塊以實現容錯。 塊大小和複製因子可以按文件配置。 應用程序可以指定文件的副本數。 該複製因子可以在文件創建時指定,並可以在以後更改。 文件HDFS是一次寫入的,並且在任何時候都只有一個寫入器(意思是不能並行寫入)。NameNode做出有關塊複製的所有決定。 它會定期收到來自羣集中每個DataNode的Heartbeat和Blockreport。 收到一份Heartbeat意味着DataNode正常運行。 Blockreport包含一個列表DataNode上的所有塊。
在這裏插入圖片描述

5.1 Replica Placement: The First Baby Steps

複製品的放置對HDFS的可靠性和性能至關重要。 ”優化副本的放置“將HDFS與大多數其他分佈式文件系統區分開來。 這個功能需要大量的調整和經驗。 機架感知副本放置策略的目的旨在提高數據可靠性,可用性和網絡帶寬利用率。 目前副本放置策略的實現是朝着這個方向邁出的第一步。實施此政策的短期目標是在生產系統上對其進行驗證,瞭解其行爲,併爲測試和研究更復雜的策略奠定基礎。大型HDFS實例在通常分佈在許多計算機上的計算機集羣上運行機架。 不同機架中兩個節點之間的通信必須通過交換機。 在大多數情況下,同一機架中的機器之間的網絡帶寬大於網絡不同機架中機器之間的帶寬。
NameNode通過概在Hadoop Rack Awareness.中的處理框架確定每個DataNode所屬的機架ID。 一個簡單但非最優的策略是將副本放在唯一(單獨的)的機架上。 這可以防止在整個機架出現故障時丟失數據並允許使用帶寬從多個機架讀取數據。 此策略在集羣中均勻分佈副本,並可以輕鬆平衡組件故障時的負載。 但是,這項政策會增加成本寫入因爲寫入需要將塊傳輸到多個機架。
對於常見情況,當複製因子爲3時,HDFS的放置策略爲將一個副本放在本地機架中的一個節點上,另一個副本放在另一個節點上(遠程)機架,最後一個副本在同一個遠程機架中的另一個節點上。 這項政策削減了機架寫入流量,通常可以提高寫入性能。 機架故障的可能性是遠遠少於節點故障; 此策略不會影響數據的可靠性和可用性擔保。 但是,它確實減少了讀取時使用的聚合網絡帶寬數據,因爲一個塊只放在兩個獨特的機架而不是三個。 有了這個政策,文件的副本不是均勻分佈在機架上。 三分之一的複製品在一個節點,三分之二的副本位於一個機架上,?另外三分之一均勻分佈在剩下的貨架。 此策略可提高寫入性能,而不會影響數據可靠性或讀取性能。此處描述的當前默認副本放置策略是正在進行的工作。

5.2 Replica Selection

爲了最大限度地減少全局帶寬消耗和讀取延遲,HDFS通過讀取來自最接近讀者的副本來努力滿足讀取要求請求。 如果同一機架上存在副本和讀取器節點,則該副本優選滿足讀取請求。 如果是angg / HDFS羣集跨越多個數據中心,然後是駐留在本地數據中心的副本優先於任何遠程副本。

5.3 Safemode

啓動時,NameNode進入一個名爲Safemode的特殊狀態。 當NameNode處於Safemode狀態時數據塊的複製是不會發生的。 NameNode收到來自DataNodes的Heartbeat和Blockreport消息。 Blockreport包含DataNode正在託管的數據塊的列表。 每個塊都有指定的最小數量副本。 當最小數量的副本已經在NameNode檢測到時,會認爲是已經安全複製的。 經過可配置的安全複製的數據塊的百分比在NameNode檢查(再加上30秒),NameNode退出Safemode狀態。 然後它接下來確定仍然少於指定數量副本的數據塊列表(如果有的話)。 NameNode然後複製這些數據塊到其他DataNode。

6 The Persistence of File System Metadata

HDFS名稱空間由NameNode存儲。 NameNode使用事務日誌調用EditLog來持久記錄文件系統元數據發生的每個更改。例如,在HDFS中創建新文件會導致NameNode將插入一條記錄到EditLog來標記這個操作。 同樣,更改文件的複製因子會導致新的要插入EditLog的記錄。 NameNode在其本地主機OS文件系統中使用文件用於存儲EditLog的系統。 整個文件系統命名空間,包括映射塊到文件和文件系統屬性,都存儲在名爲FsImage的文件中。 FsImage也作爲文件存儲在NameNode的本地文件系統中。
NameNode保留整個文件系統命名空間和文件Blockmap的鏡像在memory中。 該關鍵元數據項被設計爲緊湊的,比如NameNode帶有4 GB的RAM足以支持大量的文件和目錄。 當NameNode啓動的時候,它從磁盤讀取FsImage和EditLog,應用所有事務從EditLog到FsImage的內存中表示,並刷新的它新版本到磁盤上的新FsImage。 然後它可以截斷舊的EditLog,因爲它的事務已應用於持久性FsImage。 此過程稱爲檢查點。在當前實現中,僅在NameNode啓動時纔會發生檢查點。 支持定期檢查點工作正在進行中,在不久的將來會實現。
DataNode將HDFS數據存儲在其本地文件系統中的文件中
DataNode沒有有關HDFS文件的知識。 它將每個HDFS數據塊存儲在本地文件系統的單獨文件中。 DataNode不會在同一目錄中創建所有文件。 相反,它使用了啓發式確定每個目錄的最佳文件數並適當創建子目錄。 在同一目錄中創建所有本地文件並不是最佳選擇,因爲本地文件系統可能無法有效地支持大量單個文件的文件目錄。 當DataNode啓動時,它會掃描其本地文件系統,生成一個列表。所有與這些本地文件對應的HDFS數據塊,並將此報告發送給NameNode:這是Blockreport。

7 The Communication Protocols

所有HDFS通信協議都分層構建在TCP / IP協議之上。 一個client建立與NameNode計算機上可配置TCP端口的連接。 client通過ClientProtocol與NameNode交談。 DataNodes使用DataNode Protocol與NameNode對話。 遠程過程調用(RPC,Remote Procedure Call—遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。)抽象包裝client Protocol和DataNode Protocol。 按照設計,NameNode永遠不會初始化啓用任何RPC。相反,它只響應DataNodes或 clients發出的RPC請求。

8 Robustness

HDFS的主要目標是即使在出現故障時也能可靠地存儲數據。三種常見的故障類型是NameNode故障,DataNode故障和網絡分區

8.1 Data Disk Failure, Heartbeats and Re-Replication

每個DataNode定期向NameNode發送Heartbeat消息。 一個網絡分區可能導致DataNode的一個子集失去與NameNode的連接。 該NameNode通過Heartbeat消息的缺失來檢測此情況。 NameNode通過沒有最近的Heartbeats來標記DataNodes爲死亡狀態,並且不向它們轉發任何新的IO請求。 註冊爲死亡狀態的DataNode的任何數據都不可用於HDFS。 DataNode的死亡可能導致某些塊的複製因子低於其塊的複製因子指定值。 NameNode不斷跟蹤需要複製的塊必要時啓動複製。 重新複製的必要性可能是由於原因很多:DataNode可能變得不可用,副本可能會損壞,DataNode上的硬盤可能會失敗,或者文件的複製因子可能會增加。

8.2 Cluster Rebalancing

HDFS架構與數據重新平衡方案兼容。 一個方案如下,如果DataNode上的可用空間低於某個閾值,則自動將數據從一個DataNode移動到另一個DataNode。 如果對特定文件有突然的高需求,一個方案可以動態創建額外的副本並重新平衡羣集中的其他數據。這些類型的數據重新平衡方案尚未實現。

8.3 Data Integrity

從DataNode獲取的數據塊可能已損壞。 這種損壞可能由於存儲設備中的故障,網絡故障或有缺陷的軟件而發生。 HDFS客戶端軟件實現對HDFS文件內容的校驗和檢查。 當一個client創建一個HDFS文件,它計算文件每個塊的校驗和並存儲這些’校驗和‘於位於同一HDFS命名空間下的單獨隱藏文件中。 當客戶端檢索文件內容,它驗證從每個DataNode收到的數據校驗和是否匹配存儲在其相關聯的校驗和文件中的數據。 如果沒有,則客戶端可以選擇另一個具有該塊副本的DataNode來檢索該塊。

8.4 Metadata Disk Failure

FsImage和EditLog是HDFS的中心數據結構。 這些文件的損壞可能導致HDFS實例無法正常運行。 出於這個原因,NameNode可以配置爲支持維護FsImage和EditLog的多個副本。 任何FsImage或EditLog的更新會導致每個FsImages和EditLogs都得到同步更新。 這種同步更新FsImage和EditLog的多個副本可能會降低NameNode命名空間每秒支持事務的速率。 但是,這種降級是可以接受的,因爲雖然HDFS應用程序是它本質上是數據密集型的,但它們不是元數據密集型的。 當NameNode重新啓動時,它選擇使用最新的一致的FsImage和EditLog。NameNode計算機是HDFS集羣的單點故障。 如果是NameNode機器出現故障,需要手動干預。 目前,NameNode軟件自動重啓和故障轉移到另一臺機器暫不支持。

8.5 Snapshots

快照支持在特定時刻存儲數據副本。 一種用法快照功能可能是將損壞的HDFS實例回滾到先前已知的正常運行的時間點。 HDFS目前不支持快照,但將來會發布。

9 Data Organization

9.1 Data Blocks

HDFS旨在支持非常大的文件。 與HDFS兼容的應用程序是處理大型數據集的。 這些應用程序只寫入一次他們的數據,但是讀取數據一次或多次,並要求在流式速度下滿足這些讀取。 HDFS支持文件上的write-once-read-many語義。 HDFS使用的典型塊大小爲64MB。 因此,HDFS文件被切碎爲64 MB塊,如果可能,每個塊將會駐留在不同的DataNode上。

9.2 Staging

創建文件的client請求不會立即到達NameNode。 事實上,最初HDFS client 將文件數據緩存到臨時本地文件中。 應用程序的寫入被透明地重定向到這個臨時本地文件。 當本地文件累積數據時值得超過一個HDFS塊大小,client聯繫NameNode。 NameNode將文件名插入到文件系統層次結構併爲其分配數據塊。 NameNode使用DataNode的標識和目標數據塊的標識來響應客戶端請求。 然後,客戶端將數據塊從本地臨時文件刷新到指定的數據節點。 關閉文件時,臨時本地文件中剩餘的未刷新數據將被轉移到DataNode。 然後客戶端向NameNode傳達文件已關閉。 在此時,NameNode將文件創建操作提交到持久性存儲中。 如果NameNode在文件關閉之前死亡,則文件丟失。
在仔細考慮了目標應用之後,採用了上述方法在HDFS上運行。 這些應用程序需要流式寫入文件。 如果client寫入遠程文件直接沒有任何客戶端緩衝,網絡速度和擁塞網絡大大影響吞吐量。 這種方法並非沒有先例。 之前的分佈式文件系統(例如AFS)使用客戶端緩存來提高性能。 一個POSIX要求已經放寬,以實現更高的數據上傳性能。

9.3 Replication Pipelining

當client將數據寫入HDFS文件時,其數據首先寫入本地文件在上一節中解釋過。 假設HDFS文件的複製因子爲3。當本地文件累積出一個完整的用戶數據塊時,客戶端將檢索NameNode中的DataNode列表。 此列表包含即將託管那個塊副本的DataNodes。 然後,客戶端將數據塊刷新到第一個DataNode。 第一個DataNode開始以小部分(4 KB)接收數據,將每個部分寫入其本地存儲庫並將該部分傳輸到列表中的第二個DataNode。 反過來,第二個DataNode開始接收數據塊的每個部分,將該部分寫入其存儲庫然後將該部分刷新到第三個DataNode。 最後,第三個DataNode將數據寫入它的本地存儲庫。 因此,DataNode可以從流水線中接收前一個的數據,同時將數據轉發到流水線中的下一個。 因此,數據是從一個DataNode流向下一個。

10 Accessibility

可以通過多種不同方式從應用程序訪問HDFS。 在本地,HDFS提供了一個用於要使用的應用程序的 Java API 。 此Java API的A C語言包裝器也可用。 在此外,還可以使用HTTP瀏覽器瀏覽HDFS實例的文件。 通過WebDAV協議公開HDFS的工作正在進行。

10.1 FS Shell

HDFS允許以文件和目錄的形式組織用戶數據。 它提供了一個命令行接口,稱爲FS shell,允許用戶與HDFS中的數據進行交互。 該此命令集的語法類似於用戶已經使用的其他shell(例如bash,csh)熟悉。 以下是一些示例操作/命令對:
行動 命令
創建一個名爲 / foodir 的目錄 bin / hadoop dfs -mkdir / foodir
刪除名爲 / foodir 的目錄 bin / hadoop dfs -rmr / foodir
查看名爲 / foodir / myfile.txt的文件的內容 bin / hadoop dfs -cat / foodir /myfile.txt文件
FS shell適用於需要腳本語言與存儲交互的應用程序數據。

10.2 DFSAdmin

DFSAdmin命令集用於管理HDFS集羣。 這些是僅由HDFS管理員使用的命令。 以下是一些示例動作/命令對:
行動 命令
將羣集放在Safemode中bin / hadoop dfsadmin -safemode
輸入生成DataNode列表bin / hadoop dfsadmin -report
重新發布或退役DataNode(s)bin / hadoop dfsadmin -refreshNodes

10.3 Browser Interface

典型的HDFS安裝配置Web服務器以通過一個可配置的TCP端口公開HDFS命名空間。 這允許用戶導航HDFS命名空間並使用Web瀏覽器查看其文件的內容。

11 Space Reclamation

11.1 File Deletes and Undeletes

當用戶或應用程序刪除文件時,不會立即從HDFS中刪除該文件。相反,HDFS首先將其重命名爲 / trash目錄中的文件。 該文件可以恢復只要它留在 /垃圾桶裏 就很快 。 文件保留在/ trash中以進行配置多少時間。 在 / trash中 生命到期後 ,NameNode將從中刪除該文件HDFS名稱空間。 刪除文件會導致與文件關聯的塊釋放。 請注意,文件刪除之間可能存在明顯的時間延遲用戶以及HDFS中可用空間相應增加的時間。用戶可以在刪除文件後取消刪除文件,只要它保留在 / trash目錄中即可。如果用戶想要取消刪除他/她已刪除的文件,他/她可以導航 /垃圾目錄並檢索文件。 在 / trash目錄僅包含的最新副本已刪除的文件。 在 / trash目錄僅僅是想用一個特別的任何其他目錄功能:HDFS應用指定的策略自動刪除此目錄中的文件。 該當前默認策略是從 / trash 刪除超過6小時的文件。 在裏面未來,該政策將通過定義明確的界面進行配置

11.2 Decrease Replication Factor

當文件的複製因子減少時,NameNode選擇可以刪除的多餘副本。 下一個Heartbeat將此信息傳輸到DataNode。 該然後,DataNode刪除相應的塊,並顯示相應的可用空間在羣集中。 再重申一次,完成setReplication API調用與集羣中可用空間出現之間可能會有一段時間延遲。

12 References

HDFS Java API: http://hadoop.apache.org/core/docs/current/api/
HDFS source code: http://hadoop.apache.org/hdfs/version_control.html

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