Hadoop Distributed File System 简介
HDFS 是一個(gè) Apache Software Foundation 項(xiàng)目,是 Apache Hadoop 項(xiàng)目的一個(gè)子項(xiàng)目(參見?參考資料)。Hadoop 非常適于存儲(chǔ)大型數(shù)據(jù)(比如 terabytes 和 petabytes),并使用 HDFS 作為其存儲(chǔ)系統(tǒng)。HDFS 允許您連接多個(gè)集群中包含的節(jié)點(diǎn)?(普通個(gè)人計(jì)算機(jī)),那些集群上分布著一些數(shù)據(jù)文件。然后您可以將那些數(shù)據(jù)文件作為一個(gè)無縫文件系統(tǒng)來進(jìn)行訪問和存儲(chǔ)。對(duì)數(shù)據(jù)文件的訪問通過一種流線型(streaming)?方式進(jìn)行處理,這意味著應(yīng)用程序或命令通過 MapReduce 處理模型直接執(zhí)行(參見?參考資料)。
HDFS 是容錯(cuò)的,且提供對(duì)大數(shù)據(jù)集的高吞吐量訪問。本文探索 HDFS 的主要特性,并提供一個(gè)高級(jí) HDFS 架構(gòu)視圖。
HDFS 概覽
HDFS 與其他分布式文件系統(tǒng)有許多相似點(diǎn),但也有幾個(gè)不同點(diǎn)。一個(gè)明顯的區(qū)別是 HDFS 的 “一次寫入、多次讀取(write-once-read-many)” 模型,該模型降低了并發(fā)性控制要求,簡化了數(shù)據(jù)聚合性,支持高吞吐量訪問。
HDFS 的另一個(gè)獨(dú)特的特性是下面這個(gè)觀點(diǎn):將處理邏輯放置到數(shù)據(jù)附近通常比將數(shù)據(jù)移向應(yīng)用程序空間更好。
HDFS 將數(shù)據(jù)寫入嚴(yán)格限制為一次一個(gè)寫入程序。字節(jié)總是被附加到一個(gè)流的末尾,字節(jié)流總是以寫入順序存儲(chǔ)。
HDFS 有許多目標(biāo),下面是一些最明顯的目標(biāo):
- 通過檢測(cè)故障和應(yīng)用快速、自動(dòng)的恢復(fù)實(shí)現(xiàn)容錯(cuò)性
- 通過 MapReduce 流進(jìn)行數(shù)據(jù)訪問
- 簡單可靠的聚合模型
- 處理邏輯接近數(shù)據(jù),而不是數(shù)據(jù)接近處理邏輯
- 跨異構(gòu)普通硬件和操作系統(tǒng)的可移植性
- 可靠存儲(chǔ)和處理大量數(shù)據(jù)的可伸縮性
- 通過跨多個(gè)普通個(gè)人計(jì)算機(jī)集群分布數(shù)據(jù)和處理來節(jié)約成本
- 通過分布數(shù)據(jù)和邏輯到數(shù)據(jù)所在的多個(gè)節(jié)點(diǎn)上進(jìn)行平行處理來提高效率
- 通過自動(dòng)維護(hù)多個(gè)數(shù)據(jù)副本和在故障發(fā)生時(shí)自動(dòng)重新部署處理邏輯來實(shí)現(xiàn)可靠性
HDFS 向應(yīng)用程序提供一些接口,將它們移到更靠近數(shù)據(jù)所在的位置,下一小節(jié)將詳細(xì)介紹這一點(diǎn)。
回頁首
進(jìn)入 HDFS 的應(yīng)用程序接口
您可以以多種不同的方法訪問 HDFS。HDFS 提供了一個(gè)原生 Java? 應(yīng)用程序編程接口(API)和一個(gè)針對(duì)這個(gè) Java API 的原生 C 語言封裝器。另外,您可以使用一個(gè) web 瀏覽器來瀏覽 HDFS 文件。
表 1?中描述的應(yīng)用程序也可用于 HDFS 的接口。
表 1. 可以與 HDFS 接口的應(yīng)用程序
| FileSystem (FS) shell | 一個(gè)命令行接口,類似于常見的 Linux? 和 UNIX? shells(bash、csh,等等),支持與 HDFS 數(shù)據(jù)進(jìn)行交互。 |
| DFSAdmin | 可用于管理一個(gè) HDFS 集群的命令集。 |
| fsck | Hadoop 命令/應(yīng)用程序的一個(gè)子命令。可以使用?fsck?命令來檢查文件的不一致(比如缺失塊),但不能使用fsck?命令更正這些不一致。 |
| Name node 和 Data node | 這些節(jié)點(diǎn)擁有內(nèi)置 web 服務(wù)器,允許管理員檢查集群的當(dāng)前狀態(tài)。 |
HDFS 擁有一個(gè)功能強(qiáng)大的杰出特性集,這要?dú)w功于它的簡單但強(qiáng)大的架構(gòu)。
回頁首
HDFS 架構(gòu)
HDFS 由一些互聯(lián)的節(jié)點(diǎn)集群組成,文件和目錄駐留在那些節(jié)點(diǎn)上。一個(gè) HDFS 集群包含一個(gè)節(jié)點(diǎn),稱為?NameNode,該節(jié)點(diǎn)管理文件系統(tǒng)名稱空間并規(guī)范客戶端對(duì)文件的訪問。另外, Data node (DataNodes)將數(shù)據(jù)作為塊存儲(chǔ)在文件中。
Name node 和 Data node
在 HDFS 中,一個(gè)給定的 Name node 管理一些文件系統(tǒng)名稱空間操作,比如打開、關(guān)閉以及重命名文件和目錄。 Name node 還將數(shù)據(jù)塊映射到 Data node,處理來自 HDFS 客戶端的讀寫請(qǐng)求。 Data node 還根據(jù) Name node 的指令創(chuàng)建、刪除和復(fù)制數(shù)據(jù)塊。
圖 1?展示了 HDFS 的高級(jí)架構(gòu)。
圖 1. HDFS 架構(gòu)
如圖 1 所示,一個(gè)集群包含一個(gè) Name node 。這種設(shè)計(jì)有利于形成一個(gè)簡化模型來管理每個(gè)名稱空間并仲裁數(shù)據(jù)分布。
Name node 和 Data node 之間的關(guān)系
Name node 和 Data node 是一些軟件組件,旨在以一種解耦合方式跨多個(gè)異構(gòu)操作系統(tǒng)在普通的 PC 機(jī)上運(yùn)行。HDFS 是使用 Java 編程語言構(gòu)建的;因此,任何支持 Java 編程語言的機(jī)器都能運(yùn)行 HDFS。一個(gè)典型的安裝集群擁有一臺(tái)專用機(jī)器,用于運(yùn)行一個(gè) Name node ,可能還有一個(gè) Data node。集群中的其他每臺(tái)機(jī)器都運(yùn)行一個(gè) Data node。
通信協(xié)議
所有 HDFS 通信協(xié)議都構(gòu)建于 TCP/IP 協(xié)議之上。HDFS 客戶端連接到 Name node 上打開的一個(gè) Transmission Control Protocol (TCP) 端口,然后使用一個(gè)基于 Remote Procedure Call (RPC) 的專有協(xié)議與 Name node 通信。 Data node 使用一個(gè)基于塊的專有協(xié)議與 Name node 通信。
Data node 持續(xù)循環(huán),詢問 Name node 的指令。 Name node 不能直接連接到 Data node ,它只是從 Data node 調(diào)用的函數(shù)返回值。每個(gè) Data node 都維護(hù)一個(gè)開放的服務(wù)器套接字,以便客戶端代碼或其他 Data node 能夠讀寫數(shù)據(jù)。 Name node 知道這個(gè)服務(wù)器的主機(jī)或端口,將信息提供給有關(guān)客戶端或其他 Data node 。請(qǐng)參見?通信協(xié)議?側(cè)邊欄,了解關(guān)于 Data node、Name node 和客戶端之間通信的更多信息。
Name node 維護(hù)和管理對(duì)文件系統(tǒng)名稱空間的更改。
文件系統(tǒng)名稱空間
HDFS 支持一種傳統(tǒng)的層級(jí)式文件結(jié)構(gòu),用戶或應(yīng)用程序可以在其中創(chuàng)建目錄和保存文件。文件系統(tǒng)名稱空間層級(jí)類似于大多數(shù)其他現(xiàn)有文件系統(tǒng);您可以創(chuàng)建、重命名、重新定位和移除文件。
HDFS 還支持第三方文件系統(tǒng),比如 CloudStore 和 Amazon Simple Storage Service (S3)(參見?參考資料)。
回頁首
數(shù)據(jù)復(fù)制
HDFS 復(fù)制文件塊以便容錯(cuò)。應(yīng)用程序可以在一個(gè)文件創(chuàng)建時(shí)指定該文件的副本數(shù),這個(gè)數(shù)量可以在以后隨時(shí)更改。 Name node 負(fù)責(zé)所有塊復(fù)制決定。
機(jī)柜意識(shí)(Rack awareness)
通常,大型 HDFS 集群跨多個(gè)安裝點(diǎn)(機(jī)柜)排列。一個(gè)安裝中的不同節(jié)點(diǎn)之間的網(wǎng)絡(luò)流量通常比跨安裝點(diǎn)的網(wǎng)絡(luò)流量更高效。一個(gè) Name node 盡量將一個(gè)塊的多個(gè)副本放置到多個(gè)安裝上以提高容錯(cuò)能力。但是,HDFS 允許管理員決定一個(gè)節(jié)點(diǎn)屬于哪個(gè)安裝點(diǎn)。因此,每個(gè)節(jié)點(diǎn)都知道它的機(jī)柜 ID,也就是說,它具有機(jī)柜意識(shí)。
HDFS 使用一個(gè)智能副本放置模型來提高可靠性和性能。優(yōu)化副本放置使得 HDFS 不同于其他大多數(shù)分布式文件系統(tǒng),而一個(gè)高效使用網(wǎng)絡(luò)帶寬的、具有機(jī)柜意識(shí)的副本放置策略將進(jìn)一步促進(jìn)這種優(yōu)化。
大型 HDFS 環(huán)境通常跨多個(gè)計(jì)算機(jī)安裝點(diǎn)運(yùn)行。不同安裝點(diǎn)中的兩個(gè) Data node 之間的通信通常比同一個(gè)安裝中的 Data node 之間的通信緩慢。因此, Name node 試圖優(yōu)化 Data node 之間的通信。 Name node 通過 Data node 的機(jī)柜 ID 識(shí)別它們的位置。
回頁首
數(shù)據(jù)組織
HDFS 的一個(gè)主要目標(biāo)是支持大文件。一個(gè)典型的 HDFS 塊的大小為 64MB。因此,每個(gè) HDFS 文件包含一個(gè)或多個(gè) 64MB 塊。HDFS 嘗試將每個(gè)塊都放置到獨(dú)立的 Data node 上。
文件創(chuàng)建過程
在 HDFS 上操作文件與其他文件系統(tǒng)類似。但是,由于 HDFS 是一個(gè)顯示為單個(gè)磁盤的多機(jī)器系統(tǒng),所有操作 HDFS 上的文件的代碼都使用org.apache.hadoop.fs.FileSystem?對(duì)象(參見?參考資料)的一個(gè)子集。
清單 1?中的代碼演示了 HDFS 上的一個(gè)典型的文件創(chuàng)建過程。
清單 1. HDFS 上的典型文件創(chuàng)建過程
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);提交
當(dāng)一個(gè)客戶端在 HDFS 中創(chuàng)建一個(gè)文件時(shí),它首先將數(shù)據(jù)緩存到一個(gè)臨時(shí)本地文件中。然后,它將后續(xù)寫入重定向到這個(gè)臨時(shí)文件。當(dāng)臨時(shí)文件積累的數(shù)據(jù)足以填充一個(gè) HDFS 塊時(shí),客戶端將向 Name node 報(bào)告, Name node 將把文件轉(zhuǎn)換為一個(gè)永久 Data node。然后,客戶端關(guān)閉臨時(shí)文件,并將剩余的數(shù)據(jù)注入新創(chuàng)建的 Data node。 Name node 然后將 Data node 提交到磁盤。
復(fù)制管道化
當(dāng)一個(gè)客戶端積累了一個(gè)完整的用戶數(shù)據(jù)塊時(shí),它將從 Name node 檢索包含那個(gè)塊的副本的 Data node 的列表。然后,客戶端將整個(gè)數(shù)據(jù)塊注入這個(gè)副本列表中指定的第一個(gè) Data node 。當(dāng) Data node 接收數(shù)據(jù)塊時(shí),它將數(shù)據(jù)塊寫入磁盤,然后將副本轉(zhuǎn)移到列表中的下一個(gè) Data node 。這種管道化(pipelining)過程不斷重復(fù),直到復(fù)制因子被滿足。
回頁首
數(shù)據(jù)存儲(chǔ)可靠性
HDFS 的一個(gè)重要目標(biāo)是可靠存儲(chǔ)數(shù)據(jù),即使在 Name node、 Data node 或網(wǎng)絡(luò)分區(qū)中出現(xiàn)故障。
HDFS 克服故障的第一個(gè)步驟是探測(cè)。HDFS 使用心跳消息來探測(cè) Name node 和 Data node 之間的連通性。
HDFS 心跳
有幾種情況可能會(huì)導(dǎo)致 Name node 和 Data node 之間的連通性喪失。因此,每個(gè) Data node 都向它的 Name node 發(fā)送定期心跳消息,這樣,如果 Name node 不能接收心跳消息,就表明連通性喪失。 Name node 將不能響應(yīng)心跳消息的 Data node 標(biāo)記為 “死 Data node ”,并不再向它們發(fā)送請(qǐng)求。存儲(chǔ)在一個(gè)死節(jié)點(diǎn)上的數(shù)據(jù)不再對(duì)那個(gè)節(jié)點(diǎn)的 HDFS 客戶端可用,該節(jié)點(diǎn)將被從系統(tǒng)有效地移除。如果一個(gè)節(jié)點(diǎn)的死亡導(dǎo)致數(shù)據(jù)塊的復(fù)制因子降至最小值之下, Name node 將啟動(dòng)附加復(fù)制,將復(fù)制因子帶回正常狀態(tài)。
圖 2?展示了發(fā)送心跳消息的 HDFS 流程。
圖 2. HDFS 心跳流程
數(shù)據(jù)塊再平衡
HDFS 數(shù)據(jù)塊可能并不總是均衡地跨 Data node 分布,這意味著一個(gè)或多個(gè) Data node 的已使用空間可能沒有被充分利用。因此,HDFS 支持使用各種模型重新平衡數(shù)據(jù)塊。一種模型可能是:如果一個(gè) Data node 上的空閑空間太少,該模型將把該節(jié)點(diǎn)上的數(shù)據(jù)自動(dòng)移動(dòng)到另一個(gè)節(jié)點(diǎn)。 另一種模型可能是:如果某個(gè)文件的需求突然增加,該模型將動(dòng)態(tài)創(chuàng)建額外的副本并重新平衡一個(gè)集群中的其他數(shù)據(jù)塊。HDFS 還提供hadoop balance?命令以支持手動(dòng)平衡任務(wù)。
重新平衡的一個(gè)常見原因是集群中添加了新的 Data node 。放置新的數(shù)據(jù)塊時(shí), Name node 將考慮各種參數(shù),然后選擇接收它們的 Data node 。需要考慮的事項(xiàng)包括:
- 塊副本寫入策略
- 阻止安裝或機(jī)柜故障導(dǎo)致的數(shù)據(jù)丟失
- 減小跨安裝網(wǎng)絡(luò) I/O
- 跨集群中的 Data node 的統(tǒng)一數(shù)據(jù)分布
HDFS 的集群再平衡特性只是它用于保持其數(shù)據(jù)完整性的一種機(jī)制,稍后將討論其他機(jī)制。
數(shù)據(jù)完整性
HDFS 在確保跨集群數(shù)據(jù)完整性方面做了許多工作。它在 HDFS 文件的內(nèi)容上使用 checksum 驗(yàn)證,將計(jì)算出的 checksums 保存在實(shí)際數(shù)據(jù)所在的名稱空間中的獨(dú)立的隱藏文件中。當(dāng)客戶端檢索文件數(shù)據(jù)時(shí),它能驗(yàn)證收到的數(shù)據(jù)是否匹配關(guān)聯(lián)文件中存儲(chǔ)的 checksum。
HDFS 名稱空間通過每個(gè) Name node 保存的一個(gè)事務(wù)日志存儲(chǔ)。文件系統(tǒng)名稱空間,以及文件塊映射和文件系統(tǒng)屬性,一并保存在一個(gè)名為 FsImage 的文件中。當(dāng)一個(gè) Name node 初始化時(shí),它讀取 FsImage 文件以及其他文件,并應(yīng)用這些文件中保存的事務(wù)和狀態(tài)信息。
同步元數(shù)據(jù)更新
Name node 使用一個(gè)名為 EditLog 的日志文件持久記錄對(duì) HDFS 文件系統(tǒng)元數(shù)據(jù)發(fā)生的每個(gè)事務(wù)。如果 EditLog 或 FsImage 文件損壞,它們所屬的 HDFS 實(shí)例將無法正常工作。因此,一個(gè) Name node 支持多個(gè) FsImage 和 EditLog 文件副本。對(duì)于這些文件的多個(gè)副本,對(duì)任一文件的任何更改都將同步傳播到所有副本。當(dāng)一個(gè) Name node 重新啟動(dòng)時(shí),它使用 FsImage 和 EditLog 的最新統(tǒng)一版本來初始化自身。
HDFS 的用戶、文件和目錄權(quán)限
HDFS 對(duì)文件和目錄實(shí)現(xiàn)了一個(gè)權(quán)限模型,這個(gè)模型與 Portable Operating System Interface (POSIX) 模型有很多共同點(diǎn);例如,每個(gè)文件和目錄都關(guān)聯(lián)到一個(gè)所有者和一個(gè)組。HDFS 權(quán)限模型支持讀取(r)、寫入(w)和執(zhí)行(x)權(quán)限。由于 HDFS 中沒有文件執(zhí)行這個(gè)概念,x 權(quán)限的含義不同。簡言之,x 權(quán)限表明可以訪問一個(gè)給定父目錄的一個(gè)子目錄。一個(gè)文件或目錄的所有者是創(chuàng)建它的客戶端進(jìn)程的身份。組是父目錄的組。
快照
HDFS 原來計(jì)劃支持一些快照,這些快照可用于將一個(gè)損壞的 HDFS 實(shí)例回滾到此前狀態(tài)。但是,HDFS 的快照支持目前還沒有被提上議事日程。
回頁首
結(jié)束語
Hadoop 是一個(gè) Apache Software Foundation 分布式文件系統(tǒng)和數(shù)據(jù)管理項(xiàng)目,目標(biāo)是存儲(chǔ)和管理大量數(shù)據(jù)。Hadoop 使用一個(gè)名為 HDFS 的存儲(chǔ)系統(tǒng)來連接一些普通個(gè)人計(jì)算機(jī)(稱為節(jié)點(diǎn)),這些節(jié)點(diǎn)包含在其上分布著大量數(shù)據(jù)塊的多個(gè)集群中。通過 MapReduce 處理模型,您可以將那些數(shù)據(jù)塊作為一個(gè)無縫文件系統(tǒng)進(jìn)行訪問和存儲(chǔ)。
HDFS 與其他分布式文件系統(tǒng)有許多共同點(diǎn),但也有一些重要區(qū)別。一個(gè)重要區(qū)別是 HDFS 的 “一次寫入、多次讀取” 模型,該模型降低了并發(fā)性控制要求,簡化了數(shù)據(jù)聚合性,支持高吞吐量訪問。
為了提供一個(gè)優(yōu)化的數(shù)據(jù)訪問模型,HDFS 的設(shè)計(jì)思想是將處理邏輯放置到數(shù)據(jù)附近,而不是將數(shù)據(jù)放置到應(yīng)用程序空間附加。
參考資料
學(xué)習(xí)
- Hadoop wiki?提供關(guān)于 Hadoop 和 HDFS 的介紹。
- Hadoop API?站點(diǎn)提供用于面向 Hadoop 和 HDFS 編程的 Java 類和接口的相關(guān)文檔。
- Wikipedia 的?MapReduce?頁面是開始您的 MapReduce 框架研究的好地方。
- 訪問?Amazon S3,了解 Amazon 的 S3 基礎(chǔ)架構(gòu)。
- developerWorks 的?developerWorks 中國網(wǎng)站 Web 開發(fā)專區(qū)?專門提供關(guān)于各種 Web 解決方案的文章。
- “BigInsights -- 基于 Hadoop 的數(shù)據(jù)分析平臺(tái)”(developerWorks,2011 年 8 月):本文針對(duì) IBM 最新開發(fā)的數(shù)據(jù)分析平臺(tái)進(jìn)行概要介紹并對(duì)其應(yīng)用進(jìn)行指導(dǎo)說明。隨著信息技術(shù)應(yīng)用范圍的不斷擴(kuò)展,對(duì)數(shù)據(jù)進(jìn)行挖掘分析的需求日益增加,但是信息量的不斷增大及其應(yīng)用構(gòu)建的復(fù)雜性日益卻成為了傳統(tǒng)數(shù)據(jù)分析的一個(gè)瓶頸。IBM 構(gòu)建的數(shù)據(jù)分析平臺(tái)針對(duì)上述問題,基于 Hadoop 技術(shù),對(duì)數(shù)據(jù)查詢語言,數(shù)據(jù)分析軟件,數(shù)據(jù)庫,作業(yè)調(diào)度模塊進(jìn)行了有效整合,實(shí)現(xiàn)了對(duì)數(shù)據(jù)的有效、高效處理,保證了高度的擴(kuò)展性和兼容性。
- “實(shí)戰(zhàn) IBM BigInsights,輕松實(shí)現(xiàn) Hadoop 的部署與管理”(developerWorks,2011 年 9 月):部署 Hadoop 及其相關(guān)的大量組件復(fù)雜且容易出錯(cuò),數(shù)量眾多的管理命令也讓眾多初學(xué)者望而卻步。而 IBM BigInsights 能夠有效地解決這些問題。本文首先介紹 BigInsights,然后分析 Hadoop 部署與管理的令人頭疼問題。由此展開,逐步講述如何利用 BigInsights 輕松解決上述問題,包括部署維護(hù) Hadoop 及其組件, 使用 BigInsights Web 圖形界面控制臺(tái)。最后,文章概述了 IBM BigInsights 更多更強(qiáng)的功能。
總結(jié)
以上是生活随笔為你收集整理的Hadoop Distributed File System 简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Linux 和 Hadoop 进行
- 下一篇: 用 Hadoop 进行分布式并行编程,