Hadoop Distributed File System 简介
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 集群的命令集。 |
| fsck | Hadoop 命令/應用程序的一個子命令。可以使用?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 架構
如圖 1 所示,一個集群包含一個 Name node 。這種設計有利于形成一個簡化模型來管理每個名稱空間并仲裁數據分布。
Name node 和 Data node 之間的關系
Name node 和 Data node 是一些軟件組件,旨在以一種解耦合方式跨多個異構操作系統在普通的 PC 機上運行。HDFS 是使用 Java 編程語言構建的;因此,任何支持 Java 編程語言的機器都能運行 HDFS。一個典型的安裝集群擁有一臺專用機器,用于運行一個 Name node ,可能還有一個 Data node。集群中的其他每臺機器都運行一個 Data node。
通信協議
所有 HDFS 通信協議都構建于 TCP/IP 協議之上。HDFS 客戶端連接到 Name node 上打開的一個 Transmission Control Protocol (TCP) 端口,然后使用一個基于 Remote Procedure Call (RPC) 的專有協議與 Name node 通信。 Data node 使用一個基于塊的專有協議與 Name 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 支持一種傳統的層級式文件結構,用戶或應用程序可以在其中創建目錄和保存文件。文件系統名稱空間層級類似于大多數其他現有文件系統;您可以創建、重命名、重新定位和移除文件。
HDFS 還支持第三方文件系統,比如 CloudStore 和 Amazon Simple Storage Service (S3)(參見?參考資料)。
回頁首
數據復制
HDFS 復制文件塊以便容錯。應用程序可以在一個文件創建時指定該文件的副本數,這個數量可以在以后隨時更改。 Name node 負責所有塊復制決定。
機柜意識(Rack awareness)
通常,大型 HDFS 集群跨多個安裝點(機柜)排列。一個安裝中的不同節點之間的網絡流量通常比跨安裝點的網絡流量更高效。一個 Name node 盡量將一個塊的多個副本放置到多個安裝上以提高容錯能力。但是,HDFS 允許管理員決定一個節點屬于哪個安裝點。因此,每個節點都知道它的機柜 ID,也就是說,它具有機柜意識。
HDFS 使用一個智能副本放置模型來提高可靠性和性能。優化副本放置使得 HDFS 不同于其他大多數分布式文件系統,而一個高效使用網絡帶寬的、具有機柜意識的副本放置策略將進一步促進這種優化。
大型 HDFS 環境通常跨多個計算機安裝點運行。不同安裝點中的兩個 Data node 之間的通信通常比同一個安裝中的 Data node 之間的通信緩慢。因此, Name node 試圖優化 Data node 之間的通信。 Name node 通過 Data node 的機柜 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.xmlorg.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 心跳流程
數據塊再平衡
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 的快照支持目前還沒有被提上議事日程。
回頁首
結束語
Hadoop 是一個 Apache Software Foundation 分布式文件系統和數據管理項目,目標是存儲和管理大量數據。Hadoop 使用一個名為 HDFS 的存儲系統來連接一些普通個人計算機(稱為節點),這些節點包含在其上分布著大量數據塊的多個集群中。通過 MapReduce 處理模型,您可以將那些數據塊作為一個無縫文件系統進行訪問和存儲。
HDFS 與其他分布式文件系統有許多共同點,但也有一些重要區別。一個重要區別是 HDFS 的 “一次寫入、多次讀取” 模型,該模型降低了并發性控制要求,簡化了數據聚合性,支持高吞吐量訪問。
為了提供一個優化的數據訪問模型,HDFS 的設計思想是將處理邏輯放置到數據附近,而不是將數據放置到應用程序空間附加。
參考資料
學習
- Hadoop wiki?提供關于 Hadoop 和 HDFS 的介紹。
- Hadoop API?站點提供用于面向 Hadoop 和 HDFS 編程的 Java 類和接口的相關文檔。
- Wikipedia 的?MapReduce?頁面是開始您的 MapReduce 框架研究的好地方。
- 訪問?Amazon S3,了解 Amazon 的 S3 基礎架構。
- developerWorks 的?developerWorks 中國網站 Web 開發專區?專門提供關于各種 Web 解決方案的文章。
- “BigInsights -- 基于 Hadoop 的數據分析平臺”(developerWorks,2011 年 8 月):本文針對 IBM 最新開發的數據分析平臺進行概要介紹并對其應用進行指導說明。隨著信息技術應用范圍的不斷擴展,對數據進行挖掘分析的需求日益增加,但是信息量的不斷增大及其應用構建的復雜性日益卻成為了傳統數據分析的一個瓶頸。IBM 構建的數據分析平臺針對上述問題,基于 Hadoop 技術,對數據查詢語言,數據分析軟件,數據庫,作業調度模塊進行了有效整合,實現了對數據的有效、高效處理,保證了高度的擴展性和兼容性。
- “實戰 IBM BigInsights,輕松實現 Hadoop 的部署與管理”(developerWorks,2011 年 9 月):部署 Hadoop 及其相關的大量組件復雜且容易出錯,數量眾多的管理命令也讓眾多初學者望而卻步。而 IBM BigInsights 能夠有效地解決這些問題。本文首先介紹 BigInsights,然后分析 Hadoop 部署與管理的令人頭疼問題。由此展開,逐步講述如何利用 BigInsights 輕松解決上述問題,包括部署維護 Hadoop 及其組件, 使用 BigInsights Web 圖形界面控制臺。最后,文章概述了 IBM BigInsights 更多更強的功能。
總結
以上是生活随笔為你收集整理的Hadoop Distributed File System 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Linux 和 Hadoop 进行
- 下一篇: 用 Hadoop 进行分布式并行编程,