Hadoop Distributed File System

Hadoop Distributed File System (HDFS) — Apache Hadoop 項目的一個子項目 — 是一個高度容錯的分佈式文件系統,設計用於在低成本硬件上運行。HDFS 提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。本文探索 HDFS 的主要特性,並提供一個高級 HDFS 架構視圖。




HDFS 是一個 Apache Software Foundation 項目,是 Apache Hadoop 項目的一個子項目。Hadoop 非常適於存儲大型數據(比如 terabytes 和 petabytes),並使用 HDFS 作爲其存儲系統。HDFS 允許您連接多個集羣中包含的節點(普通個人計算機),那些集羣上分佈着一些數據文件。然後您可以將那些數據文件作爲一個無縫文件系統來進行訪問和存儲。對數據文件的訪問通過一種流線型(streaming)方式進行處理,這意味着應用程序或命令通過 MapReduce 處理模型直接執行

HDFS 是容錯的,且提供對大數據集的高吞吐量訪問。本文探索 HDFS 的主要特性,並提供一個高級 HDFS 架構視圖。

HDFS 概覽

HDFS 與其他分佈式文件系統有許多相似點,但也有幾個不同點。一個明顯的區別是 HDFS 的 “一次寫入、多次讀取(write-once-read-many)” 模型,該模型降低了併發性控制要求,簡化了數據聚合性,支持高吞吐量訪問。

HDFS 的另一個獨特的特性是下面這個觀點:將處理邏輯放置到數據附近通常比將數據移向應用程序空間更好。

HDFS 將數據寫入嚴格限制爲一次一個寫入程序。字節總是被附加到一個流的末尾,字節流總是以寫入順序存儲。

HDFS 有許多目標,下面是一些最明顯的目標:

  • 通過檢測故障和應用快速、自動的恢復實現容錯性

  • 通過 MapReduce 流進行數據訪問

  • 簡單可靠的聚合模型

  • 處理邏輯接近數據,而不是數據接近處理邏輯

  • 跨異構普通硬件和操作系統的可移植性

  • 可靠存儲和處理大量數據的可伸縮性

  • 通過跨多個普通個人計算機集羣分佈數據和處理來節約成本

  • 通過分佈數據和邏輯到數據所在的多個節點上進行平行處理來提高效率

  • 通過自動維護多個數據副本和在故障發生時自動重新部署處理邏輯來實現可靠性

HDFS 嚮應用程序提供一些接口,將它們移到更靠近數據所在的位置,下一小節將詳細介紹這一點。


進入 HDFS 的應用程序接口

您可以以多種不同的方法訪問 HDFS。HDFS 提供了一個原生 Java 應用程序編程接口(API)和一個針對這個 Java API 的原生 C 語言封裝器。另外,您可以使用一個 web 瀏覽器來瀏覽 HDFS 文件。

表 1中描述的應用程序也可用於 HDFS 的接口。

表 1. 可以與 HDFS 接口的應用程序
應用程序說明
FileSystem (FS) shell一個命令行接口,類似於常見的 Linux 和 UNIX shells(bash、csh,等等),支持與 HDFS 數據進行交互。
DFSAdmin可用於管理一個 HDFS 集羣的命令集。
fsckHadoop 命令/應用程序的一個子命令。可以使用fsck命令來檢查文件的不一致(比如缺失塊),但不能使用fsck命令更正這些不一致。
Name node 和 Data node這些節點擁有內置 web 服務器,允許管理員檢查集羣的當前狀態。

HDFS 擁有一個功能強大的傑出特性集,這要歸功於它的簡單但強大的架構。



HDFS 架構

HDFS 由一些互聯的節點集羣組成,文件和目錄駐留在那些節點上。一個 HDFS 集羣包含一個節點,稱爲NameNode,該節點管理文件系統名稱空間並規範客戶端對文件的訪問。另外, Data node (DataNodes)將數據作爲塊存儲在文件中。

Name node 和 Data node

在 HDFS 中,一個給定的 Name node 管理一些文件系統名稱空間操作,比如打開、關閉以及重命名文件和目錄。 Name node 還將數據塊映射到 Data node,處理來自 HDFS 客戶端的讀寫請求。 Data node 還根據 Name node 的指令創建、刪除和複製數據塊。

圖 1展示了 HDFS 的高級架構。

圖 1. HDFS 架構
wKiom1NWYvySPHJvAABKVBX0fMs677.gif

如圖 1 所示,一個集羣包含一個 Name node 。這種設計有利於形成一個簡化模型來管理每個名稱空間並仲裁數據分佈。

Name node 和 Data node 之間的關係

Name node 和 Data node 是一些軟件組件,旨在以一種解耦合方式跨多個異構操作系統在普通的 PC 機上運行。HDFS 是使用 Java 編程語言構建的;因此,任何支持 Java 編程語言的機器都能運行 HDFS。一個典型的安裝集羣擁有一臺專用機器,用於運行一個 Name node ,可能還有一個 Data node。集羣中的其他每臺機器都運行一個 Data node。

Data node 持續循環,詢問 Name node 的指令。 Name node 不能直接連接到 Data node ,它只是從 Data node 調用的函數返回值。每個 Data node 都維護一個開放的服務器套接字,以便客戶端代碼或其他 Data node 能夠讀寫數據。 Name node 知道這個服務器的主機或端口,將信息提供給有關客戶端或其他 Data node 。請參見通信協議側邊欄,瞭解關於 Data node、Name node 和客戶端之間通信的更多信息。

Name node 維護和管理對文件系統名稱空間的更改。

註釋:通信協議

所有 HDFS 通信協議都構建於 TCP/IP 協議之上。HDFS 客戶端連接到 Name node 上打開的一個 Transmission Control Protocol (TCP) 端口,然後使用一個基於 Remote Procedure Call (RPC) 的專有協議與 Name node 通信。 Data node 使用一個基於塊的專有協議與 Name node 通信。

文件系統名稱空間

HDFS 支持一種傳統的層級式文件結構,用戶或應用程序可以在其中創建目錄和保存文件。文件系統名稱空間層級類似於大多數其他現有文件系統;您可以創建、重命名、重新定位和移除文件。

HDFS 還支持第三方文件系統,比如 CloudStore 和 Amazon Simple Storage Service (S3)



數據複製

HDFS 複製文件塊以便容錯。應用程序可以在一個文件創建時指定該文件的副本數,這個數量可以在以後隨時更改。 Name node 負責所有塊複製決定。

HDFS 使用一個智能副本放置模型來提高可靠性和性能。優化副本放置使得 HDFS 不同於其他大多數分佈式文件系統,而一個高效使用網絡帶寬的、具有機櫃意識的副本放置策略將進一步促進這種優化。

大型 HDFS 環境通常跨多個計算機安裝點運行。不同安裝點中的兩個 Data node 之間的通信通常比同一個安裝中的 Data node 之間的通信緩慢。因此, Name node 試圖優化 Data node 之間的通信。 Name node 通過 Data node 的機櫃 ID 識別它們的位置。

註釋:

機櫃意識(Rack awareness)

通常,大型 HDFS 集羣跨多個安裝點(機櫃)排列。一個安裝中的不同節點之間的網絡流量通常比跨安裝點的網絡流量更高效。一個 Name node 儘量將一個塊的多個副本放置到多個安裝上以提高容錯能力。但是,HDFS 允許管理員決定一個節點屬於哪個安裝點。因此,每個節點都知道它的機櫃 ID,也就是說,它具有機櫃意識


數據組織

HDFS 的一個主要目標是支持大文件。一個典型的 HDFS 塊的大小爲 64MB。因此,每個 HDFS 文件包含一個或多個 64MB 塊。HDFS 嘗試將每個塊都放置到獨立的 Data node 上。

文件創建過程

在 HDFS 上操作文件與其他文件系統類似。但是,由於 HDFS 是一個顯示爲單個磁盤的多機器系統,所有操作 HDFS 上的文件的代碼都使用org.apache.hadoop.fs.FileSystem對象的一個子集。

清單 1中的代碼演示了 HDFS 上的一個典型的文件創建過程。

清單 1. HDFS 上的典型文件創建過程
byte[] fileData = retrieveFileDataFromSomewhere();
 String filePath = retrieveFilePathStringFromSomewhere();
 Configuration config = new Configuration();  // assumes to automatically load
                                              // hadoop-default.xml and hadoop-site.xml
 org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(config);
 org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(filePath);
 org.apache.hadoop.fs.FSDataOutputStream outputStream = hdfs.create(path);
 outputStream.write(fileData, 0, fileData.length);


提交

當一個客戶端在 HDFS 中創建一個文件時,它首先將數據緩存到一個臨時本地文件中。然後,它將後續寫入重定向到這個臨時文件。當臨時文件積累的數據足以填充一個 HDFS 塊時,客戶端將向 Name node 報告, Name node 將把文件轉換爲一個永久 Data node。然後,客戶端關閉臨時文件,並將剩餘的數據注入新創建的 Data node。 Name node 然後將 Data node 提交到磁盤。

複製管道化

當一個客戶端積累了一個完整的用戶數據塊時,它將從 Name node 檢索包含那個塊的副本的 Data node 的列表。然後,客戶端將整個數據塊注入這個副本列表中指定的第一個 Data node 。當 Data node 接收數據塊時,它將數據塊寫入磁盤,然後將副本轉移到列表中的下一個 Data node 。這種管道化(pipelining)過程不斷重複,直到複製因子被滿足。



數據存儲可靠性

HDFS 的一個重要目標是可靠存儲數據,即使在 Name node、 Data node 或網絡分區中出現故障。

HDFS 克服故障的第一個步驟是探測。HDFS 使用心跳消息來探測 Name node 和 Data node 之間的連通性。

HDFS 心跳

有幾種情況可能會導致 Name node 和 Data node 之間的連通性喪失。因此,每個 Data node 都向它的 Name node 發送定期心跳消息,這樣,如果 Name node 不能接收心跳消息,就表明連通性喪失。 Name node 將不能響應心跳消息的 Data node 標記爲 “死 Data node ”,並不再向它們發送請求。存儲在一個死節點上的數據不再對那個節點的 HDFS 客戶端可用,該節點將被從系統有效地移除。如果一個節點的死亡導致數據塊的複製因子降至最小值之下, Name node 將啓動附加複製,將複製因子帶回正常狀態。

圖 2展示了發送心跳消息的 HDFS 流程。

圖 2. HDFS 心跳流程

wKiom1NWZImh_2hZAABTWRWeAgc114.gif

數據塊再平衡

HDFS 數據塊可能並不總是均衡地跨 Data node 分佈,這意味着一個或多個 Data node 的已使用空間可能沒有被充分利用。因此,HDFS 支持使用各種模型重新平衡數據塊。一種模型可能是:如果一個 Data node 上的空閒空間太少,該模型將把該節點上的數據自動移動到另一個節點。 另一種模型可能是:如果某個文件的需求突然增加,該模型將動態創建額外的副本並重新平衡一個集羣中的其他數據塊。HDFS 還提供hadoop balance命令以支持手動平衡任務。

重新平衡的一個常見原因是集羣中添加了新的 Data node 。放置新的數據塊時, Name node 將考慮各種參數,然後選擇接收它們的 Data node 。需要考慮的事項包括:

  • 塊副本寫入策略

  • 阻止安裝或機櫃故障導致的數據丟失

  • 減小跨安裝網絡 I/O

  • 跨集羣中的 Data node 的統一數據分佈

HDFS 的集羣再平衡特性只是它用於保持其數據完整性的一種機制,稍後將討論其他機制。

數據完整性

HDFS 在確保跨集羣數據完整性方面做了許多工作。它在 HDFS 文件的內容上使用 checksum 驗證,將計算出的 checksums 保存在實際數據所在的名稱空間中的獨立的隱藏文件中。當客戶端檢索文件數據時,它能驗證收到的數據是否匹配關聯文件中存儲的 checksum。

HDFS 名稱空間通過每個 Name node 保存的一個事務日誌存儲。文件系統名稱空間,以及文件塊映射和文件系統屬性,一併保存在一個名爲 FsImage 的文件中。當一個 Name node 初始化時,它讀取 FsImage 文件以及其他文件,並應用這些文件中保存的事務和狀態信息。

同步元數據更新

Name node 使用一個名爲 EditLog 的日誌文件持久記錄對 HDFS 文件系統元數據發生的每個事務。如果 EditLog 或 FsImage 文件損壞,它們所屬的 HDFS 實例將無法正常工作。因此,一個 Name node 支持多個 FsImage 和 EditLog 文件副本。對於這些文件的多個副本,對任一文件的任何更改都將同步傳播到所有副本。當一個 Name node 重新啓動時,它使用 FsImage 和 EditLog 的最新統一版本來初始化自身

HDFS 的用戶、文件和目錄權限

HDFS 對文件和目錄實現了一個權限模型,這個模型與 Portable Operating System Interface (POSIX) 模型有很多共同點;例如,每個文件和目錄都關聯到一個所有者和一個組。HDFS 權限模型支持讀取(r)、寫入(w)和執行(x)權限。由於 HDFS 中沒有文件執行這個概念,x 權限的含義不同。簡言之,x 權限表明可以訪問一個給定父目錄的一個子目錄。一個文件或目錄的所有者是創建它的客戶端進程的身份。組是父目錄的組。

快照

HDFS 原來計劃支持一些快照,這些快照可用於將一個損壞的 HDFS 實例回滾到此前狀態。但是,HDFS 的快照支持目前還沒有被提上議事日程。

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