HDFS體系結(jié)構(gòu)指南

原文

介紹

Hadoop分布式文件系統(tǒng)( <acronym title="Hadoop分布式文件系統(tǒng)" style="cursor: help;">HDFS</acronym> )是一種分布式文件系統(tǒng),設(shè)計(jì)用于在商品硬件上運(yùn)行。它與現(xiàn)有的分布式文件系統(tǒng)有許多相似之處。但是,與其他分布式文件系統(tǒng)的差異很大。HDFS具有高度容錯(cuò)能力,旨在部署在低成本硬件上。HDFS提供對(duì)應(yīng)用程序數(shù)據(jù)的高吞吐量訪問,適用于具有大型數(shù)據(jù)集的應(yīng)用程序。HDFS放寬了一些POSIX要求,以啟用對(duì)文件系統(tǒng)數(shù)據(jù)的流式訪問。HDFS最初是作為Apache Nutch網(wǎng)絡(luò)搜索引擎項(xiàng)目的基礎(chǔ)架構(gòu)而構(gòu)建的。HDFS現(xiàn)在是一個(gè)Apache Hadoop子項(xiàng)目。項(xiàng)目URL是http://hadoop.apache.org/hdfs/ 。

假設(shè)和目標(biāo)

硬件故障

硬件故障是常態(tài)而非例外。一個(gè)HDFS實(shí)例可能由數(shù)百或數(shù)千個(gè)服務(wù)器機(jī)器組成,每個(gè)服務(wù)器機(jī)器都存儲(chǔ)部分文件系統(tǒng)的數(shù)據(jù)。事實(shí)上,有大量的組件,并且每個(gè)組件具有不可忽略的失敗概率,這意味著HDFS的某個(gè)組件始終不起作用。因此,檢測(cè)故障并快速自動(dòng)恢復(fù)是HDFS的核心架構(gòu)目標(biāo)。

流數(shù)據(jù)訪問

在HDFS上運(yùn)行的應(yīng)用程序需要流式訪問其數(shù)據(jù)集。它們不是通常運(yùn)行在通用文件系統(tǒng)上的通用應(yīng)用程序。HDFS的設(shè)計(jì)更多用于批處理,而不是用戶交互式使用。重點(diǎn)是數(shù)據(jù)訪問的高吞吐量,而不是數(shù)據(jù)訪問的低延遲。POSIX強(qiáng)加了HDFS所針對(duì)的應(yīng)用程序所不需要的許多硬性要求。一些關(guān)鍵領(lǐng)域的POSIX語義已被舍棄以提高數(shù)據(jù)吞吐率。

大型數(shù)據(jù)集

在HDFS上運(yùn)行的應(yīng)用程序具有大量數(shù)據(jù)集。HDFS中的典型文件大小為千兆字節(jié)(gigabytes)至兆兆字節(jié)(terabytes)。因此,HDFS被調(diào)整為支持大文件。它應(yīng)該為單個(gè)群集中的數(shù)百個(gè)節(jié)點(diǎn)提供高聚合數(shù)據(jù)帶寬和規(guī)模(high aggregate data bandwidth and scale)。它應(yīng)該支持單個(gè)實(shí)例中的數(shù)千萬個(gè)文件。

簡(jiǎn)單一致性模型

HDFS應(yīng)用程序需要一次寫入多次讀取多個(gè)文件訪問模型。一次創(chuàng)建,寫入和關(guān)閉的文件不需要更改。這種假設(shè)簡(jiǎn)化了數(shù)據(jù)一致性問題并實(shí)現(xiàn)了高吞吐量數(shù)據(jù)訪問。MapReduce應(yīng)用程序或Web爬蟲應(yīng)用程序完全符合此模型。有一個(gè)計(jì)劃來支持未來對(duì)文件的追加寫入。

“移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)便宜”

如果應(yīng)用程序在其操作的數(shù)據(jù)附近執(zhí)行,則應(yīng)用程序所請(qǐng)求的計(jì)算效率會(huì)更高。當(dāng)數(shù)據(jù)集的大小很大時(shí)尤其如此。這可以最大限度地減少網(wǎng)絡(luò)擁塞并提高系統(tǒng)的整體吞吐量。我們的假設(shè)是,將計(jì)算遷移到更接近數(shù)據(jù)所在的位置通常會(huì)更好,而不是將數(shù)據(jù)移動(dòng)到應(yīng)用程序正在運(yùn)行的位置。HDFS為應(yīng)用程序提供接口,使它們更接近數(shù)據(jù)所在的位置。

跨異構(gòu)硬件和軟件平臺(tái)的可移植性

HDFS的設(shè)計(jì)很容易從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)。這有利于廣泛采用HDFS作為大量應(yīng)用選擇的平臺(tái)。

NameNode和DataNodes

HDFS具有主/從架構(gòu)。一個(gè)HDFS集群包含一個(gè)NameNode,一個(gè)主服務(wù)器,用于管理文件系統(tǒng)名稱空間并管理客戶端對(duì)文件的訪問。此外,還有許多DataNode,通常是群集中的每個(gè)節(jié)點(diǎn)一個(gè)DataNode,用于管理連接到它們所運(yùn)行的節(jié)點(diǎn)的存儲(chǔ)。HDFS公開文件系統(tǒng)名稱空間并允許用戶數(shù)據(jù)存儲(chǔ)在文件中。在內(nèi)部,文件被分成一個(gè)或多個(gè)塊,這些塊存儲(chǔ)在一組DataNode中。NameNode執(zhí)行文件系統(tǒng)命名空間操作,如打開,關(guān)閉和重命名文件和目錄。它還確定塊到DataNode的映射。DataNode負(fù)責(zé)提供來自文件系統(tǒng)客戶端的讀取和寫入請(qǐng)求。DataNode還根據(jù)來自NameNode的指令執(zhí)行數(shù)據(jù)塊創(chuàng)建,刪除和復(fù)制。

HDFS體系結(jié)構(gòu)

NameNode和DataNode是設(shè)計(jì)用于在商品機(jī)器上運(yùn)行的軟件。這些機(jī)器通常運(yùn)行GNU / Linux操作系統(tǒng)( <acronym title="操作系統(tǒng)" style="cursor: help;">OS</acronym> )。HDFS使用Java語言構(gòu)建;任何支持Java的機(jī)器都可以運(yùn)行NameNode或DataNode軟件。使用高度可移植的Java語言意味著HDFS可以部署在各種機(jī)器上。典型的部署有一臺(tái)只運(yùn)行NameNode軟件的專用機(jī)器。群集中的每臺(tái)其他機(jī)器運(yùn)行DataNode軟件的一個(gè)實(shí)例。該體系結(jié)構(gòu)不排除在同一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)DataNode,但在實(shí)際部署中很少出現(xiàn)這種情況。

集群中單個(gè)NameNode的存在極大地簡(jiǎn)化了系統(tǒng)的體系結(jié)構(gòu)。NameNode是所有HDFS元數(shù)據(jù)的仲裁者和存儲(chǔ)庫(kù)。該系統(tǒng)的設(shè)計(jì)方式是用戶數(shù)據(jù)永遠(yuǎn)不會(huì)流經(jīng)NameNode。

文件系統(tǒng)命名空間

HDFS支持傳統(tǒng)的分層文件組織。用戶或應(yīng)用程序可以在這些目錄內(nèi)創(chuàng)建目錄并存儲(chǔ)文件。文件系統(tǒng)名稱空間層次與大多數(shù)其他現(xiàn)有文件系統(tǒng)類似;可以創(chuàng)建和刪除文件,將文件從一個(gè)目錄移動(dòng)到另一個(gè)目錄,或者重命名文件。HDFS尚未實(shí)現(xiàn)用戶配額。HDFS不支持硬鏈接或軟鏈接。但是,HDFS體系結(jié)構(gòu)并不排除實(shí)現(xiàn)這些功能。

NameNode維護(hù)文件系統(tǒng)名稱空間。NameNode記錄對(duì)文件系統(tǒng)名稱空間或其屬性的任何更改。應(yīng)用程序可以指定HDFS應(yīng)該維護(hù)的文件的副本數(shù)量。文件的副本數(shù)稱為該文件的復(fù)制因子。這些信息由NameNode存儲(chǔ)。

數(shù)據(jù)復(fù)制

HDFS旨在可靠地在大型群集中的機(jī)器上存儲(chǔ)超大型文件。它將每個(gè)文件存儲(chǔ)為一系列的塊;文件中除最后一個(gè)塊之外的所有塊都具有相同的大小。文件的塊被復(fù)制以實(shí)現(xiàn)容錯(cuò)。塊大小和復(fù)制因子可以針對(duì)每個(gè)文件進(jìn)行配置。應(yīng)用程序可以指定文件的副本數(shù)量??梢栽谖募?chuàng)建時(shí)指定復(fù)制因子,并可稍后進(jìn)行更改。HDFS中的文件是一次寫入的,并且在任何時(shí)候都嚴(yán)格限定一個(gè)寫入者。

NameNode做出關(guān)于塊復(fù)制的所有決定。它定期從集群中的每個(gè)DataNode接收Heartbeat和Blockreport。收到Heartbeat意味著DataNode運(yùn)行正常。Blockreport包含DataNode上所有塊的列表。

HDFS數(shù)據(jù)節(jié)點(diǎn)

復(fù)制品安置:第一個(gè)嬰兒步驟

復(fù)制品的放置對(duì)于HDFS的可靠性和性能至關(guān)重要。優(yōu)化副本位置可將HDFS與大多數(shù)其他分布式文件系統(tǒng)區(qū)分開來。這是一項(xiàng)需要大量調(diào)整和體驗(yàn)的功能。機(jī)架感知復(fù)制品放置策略(rack-aware replica placement policy)的目的是提高數(shù)據(jù)可靠性,可用性和網(wǎng)絡(luò)帶寬利用率。復(fù)制品放置策略的當(dāng)前實(shí)現(xiàn)是朝這個(gè)方向的第一步。實(shí)施這項(xiàng)策略的短期目標(biāo)是在生產(chǎn)系統(tǒng)上對(duì)其進(jìn)行驗(yàn)證,更多地了解其行為,并為測(cè)試和研究更復(fù)雜的策略奠定基礎(chǔ)。

大型HDFS實(shí)例運(yùn)行在通常分布在多個(gè)機(jī)架上的一組計(jì)算機(jī)上。不同機(jī)架中兩個(gè)節(jié)點(diǎn)之間的通信必須通過交換機(jī)。在大多數(shù)情況下,同一機(jī)架中機(jī)器之間的網(wǎng)絡(luò)帶寬大于不同機(jī)架中機(jī)器之間的網(wǎng)絡(luò)帶寬。

NameNode通過Hadoop Rack Awareness中概述的過程確定每個(gè)DataNode所屬的機(jī)架標(biāo)識(shí)。一個(gè)簡(jiǎn)單但非最佳的策略是將副本放在不同的機(jī)架上。這可以防止整個(gè)機(jī)架出現(xiàn)故障時(shí)丟失數(shù)據(jù),并允許在讀取數(shù)據(jù)時(shí)從多個(gè)機(jī)架使用帶寬。此策略在集群中均勻分配副本,以便輕松平衡組件故障時(shí)的負(fù)載。但是,此策略會(huì)增加寫入成本,因?yàn)閷懭胄枰獙K傳輸?shù)蕉鄠€(gè)機(jī)架。

對(duì)于常見情況,當(dāng)復(fù)制因子為3時(shí),HDFS的放置策略是將一個(gè)副本放在本地機(jī)架中的一個(gè)節(jié)點(diǎn)上,另一個(gè)放在另一個(gè)(遠(yuǎn)程)機(jī)架中的節(jié)點(diǎn)上,并將最后一個(gè)放在相同的遠(yuǎn)程機(jī)架的不同節(jié)點(diǎn)上。該策略可以減少機(jī)架間寫入流量,這通常會(huì)提高寫入性能。機(jī)架故障的機(jī)會(huì)遠(yuǎn)遠(yuǎn)小于節(jié)點(diǎn)故障的機(jī)會(huì);此策略不會(huì)影響數(shù)據(jù)可靠性和可用性保證。但是,它確實(shí)降低了讀取數(shù)據(jù)時(shí)使用的總體網(wǎng)絡(luò)帶寬,因?yàn)閴K僅放置在兩個(gè)不同的機(jī)架中,而不是三個(gè)。使用此策略,文件的副本不會(huì)均勻分布在機(jī)架上。三分之一的副本位于一個(gè)節(jié)點(diǎn)上,三分之二的副本位于一個(gè)機(jī)架上,另外三分之一的副本均勻分布在其余機(jī)架上。此策略可提高寫入性能,而不會(huì)影響數(shù)據(jù)可靠性或讀取性能。

此處描述的當(dāng)前默認(rèn)副本放置策略是一項(xiàng)正在進(jìn)行的工作。

副本選擇

為了最大限度地降低全局帶寬消耗和讀取延遲,HDFS會(huì)嘗試滿足最接近讀者的副本的讀取請(qǐng)求。如果在讀者節(jié)點(diǎn)的同一機(jī)架上存在副本,則該副本優(yōu)先滿足讀取請(qǐng)求。如果HDFS集群跨越多個(gè)數(shù)據(jù)中心,則駐留在本地?cái)?shù)據(jù)中心的副本優(yōu)先于任何遠(yuǎn)程副本。

安全模式

在啟動(dòng)時(shí),NameNode進(jìn)入一個(gè)稱為Safemode的特殊狀態(tài)。當(dāng)NameNode處于安全模式狀態(tài)時(shí),不會(huì)發(fā)生數(shù)據(jù)塊的復(fù)制。NameNode接收來自DataNode的Heartbeat和Blockreport消息。Blockreport包含DataNode托管的數(shù)據(jù)塊列表。每個(gè)塊都有指定的最小數(shù)量的副本。當(dāng)該數(shù)據(jù)塊的最小副本數(shù)已與NameNode簽入時(shí),該塊被認(rèn)為是安全復(fù)制的。在安全復(fù)制數(shù)據(jù)塊的可配置百分比簽入NameNode(再加上30秒)之后,NameNode退出安全模式狀態(tài)。然后確定(如果有的話)仍然少于指定的副本數(shù)量的數(shù)據(jù)塊的列表。NameNode然后將這些塊復(fù)制到其他DataNode。

文件系統(tǒng)元數(shù)據(jù)的持久性

HDFS名稱空間由NameNode存儲(chǔ)。NameNode使用名為EditLog的事務(wù)日志來持久記錄文件系統(tǒng)元數(shù)據(jù)發(fā)生的所有更改。例如,在HDFS中創(chuàng)建一個(gè)新文件會(huì)導(dǎo)致NameNode向EditLog中插入一條記錄,指出這一點(diǎn)。同樣,更改文件的復(fù)制因子會(huì)導(dǎo)致將新記錄插入到EditLog中。NameNode使用其本地主機(jī)OS文件系統(tǒng)中的文件來存儲(chǔ)EditLog。整個(gè)文件系統(tǒng)名稱空間(包括塊到文件和文件系統(tǒng)屬性的映射)存儲(chǔ)在名為FsImage的文件中。FsImage也作為文件存儲(chǔ)在NameNode的本地文件系統(tǒng)中。

NameNode將整個(gè)文件系統(tǒng)名稱空間和文件Blockmap的映像保存在內(nèi)存中。這個(gè)關(guān)鍵的元數(shù)據(jù)項(xiàng)目設(shè)計(jì)得很緊湊,這樣一個(gè)具有4GB RAM的NameNode足以支持大量的文件和目錄。當(dāng)NameNode啟動(dòng)時(shí),它從磁盤讀取FsImage和EditLog,將EditLog中的所有事務(wù)應(yīng)用到FsImage的內(nèi)存中表示,并將此新版本刷新到磁盤上的新FsImage中。它可以截?cái)嗯f的EditLog,因?yàn)樗氖聞?wù)已經(jīng)被應(yīng)用到持久的FsImage。這個(gè)過程被稱為檢查點(diǎn)。在當(dāng)前的實(shí)現(xiàn)中,只有在NameNode啟動(dòng)時(shí)才會(huì)出現(xiàn)檢查點(diǎn)。正在開展工作以支持不久的將來的定期檢查點(diǎn)。

DataNode將HDFS數(shù)據(jù)存儲(chǔ)在本地文件系統(tǒng)中的文件中。DataNode沒有關(guān)于HDFS文件的知識(shí)。它將每個(gè)HDFS數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)中的單獨(dú)文件中。DataNode不會(huì)在同一目錄中創(chuàng)建所有文件。相反,它使用啟發(fā)式來確定每個(gè)目錄的最佳文件數(shù)量并適當(dāng)?shù)貏?chuàng)建子目錄。在同一目錄中創(chuàng)建所有本地文件并不是最佳選擇,因?yàn)楸镜匚募到y(tǒng)可能無法有效地支持單個(gè)目錄中的大量文件。當(dāng)DataNode啟動(dòng)時(shí),它掃描其本地文件系統(tǒng),生成與每個(gè)本地文件相對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,并將此報(bào)告發(fā)送給NameNode:這是Blockreport。

通信協(xié)議

所有HDFS通信協(xié)議都在TCP / IP協(xié)議之上進(jìn)行分層??蛻舳私⒌絅ameNode機(jī)器上可配置<acronym title="傳輸控制協(xié)議" style="cursor: help;">TCP</acronym>端口的連接。它與NameNode按照ClientProtocol交談。DataNode使用DataNode協(xié)議與NameNode進(jìn)行通信。遠(yuǎn)程過程調(diào)用( <acronym title="遠(yuǎn)程過程調(diào)用" style="cursor: help;">RPC</acronym> )抽象包裝了客戶端協(xié)議和DataNode協(xié)議。根據(jù)設(shè)計(jì),NameNode永遠(yuǎn)不會(huì)啟動(dòng)任何RPC。相反,它只響應(yīng)DataNode或客戶端發(fā)出的RPC請(qǐng)求。

穩(wěn)健性

HDFS的主要目標(biāo)是即使在出現(xiàn)故障時(shí)也能可靠地存儲(chǔ)數(shù)據(jù)。三種常見類型的故障是NameNode故障,DataNode故障和網(wǎng)絡(luò)分區(qū)。

數(shù)據(jù)磁盤故障,心跳和重新復(fù)制

每個(gè)DataNode定期向NameNode發(fā)送一個(gè)Heartbeat消息。網(wǎng)絡(luò)分區(qū)可能會(huì)導(dǎo)致一部分DataNode失去與NameNode的連接。NameNode通過缺少Heartbeat消息來檢測(cè)這種情況。NameNode將沒有最近Heartbeats的DataNode標(biāo)記為死亡,并且不會(huì)向它們轉(zhuǎn)發(fā)任何新的<acronym title="輸入輸出" style="cursor: help;">IO</acronym>請(qǐng)求。任何注冊(cè)到死亡DataNode的數(shù)據(jù)不再可用于HDFS。DataNode死亡可能導(dǎo)致某些塊的復(fù)制因子降到其指定值以下。NameNode會(huì)不斷跟蹤哪些塊需要復(fù)制,并在需要時(shí)啟動(dòng)復(fù)制。重新復(fù)制的必要性可能由于許多原因而產(chǎn)生:DataNode可能變得不可用,副本可能會(huì)損壞,DataNode上的硬盤可能會(huì)失敗,或者文件的復(fù)制因子可能會(huì)增加。

群集重新平衡

HDFS架構(gòu)與數(shù)據(jù)重新平衡方案兼容。如果DataNode上的可用空間低于某個(gè)閾值,則方案可能會(huì)自動(dòng)將數(shù)據(jù)從一個(gè)DataNode移動(dòng)到另一個(gè)DataNode。在特定文件突然高需求的情況下,一個(gè)方案可能會(huì)動(dòng)態(tài)創(chuàng)建額外的副本并重新平衡群集中的其他數(shù)據(jù)。這些類型的數(shù)據(jù)重新平衡方案尚未實(shí)施。

數(shù)據(jù)的完整性

從DataNode獲取的數(shù)據(jù)塊可能已損壞。由于存儲(chǔ)設(shè)備故障,網(wǎng)絡(luò)故障或軟件錯(cuò)誤,可能會(huì)發(fā)生此損壞。HDFS客戶端軟件對(duì)HDFS文件的內(nèi)容執(zhí)行校驗(yàn)和檢查。當(dāng)客戶端創(chuàng)建HDFS文件時(shí),它會(huì)計(jì)算文件每個(gè)塊的校驗(yàn)和,并將這些校驗(yàn)和存儲(chǔ)在同一個(gè)HDFS名稱空間中的單獨(dú)隱藏文件中。當(dāng)客戶端檢索文件內(nèi)容時(shí),它會(huì)驗(yàn)證從每個(gè)DataNode收到的數(shù)據(jù)是否與存儲(chǔ)在相關(guān)校驗(yàn)和文件中的校驗(yàn)和相匹配。如果不是,那么客戶端可以選擇從另一個(gè)具有該塊的副本的DataNode中檢索該塊。

元數(shù)據(jù)磁盤失敗

FsImage和EditLog是HDFS的中心數(shù)據(jù)結(jié)構(gòu)。這些文件的損壞可能會(huì)導(dǎo)致HDFS實(shí)例失效。由于這個(gè)原因,NameNode可以配置為支持維護(hù)FsImage和EditLog的多個(gè)副本。對(duì)FsImage或EditLog的任何更新都會(huì)導(dǎo)致每個(gè)FsImages和EditLog同步更新。同步更新FsImage和EditLog的多個(gè)副本可能會(huì)降低NameNode每秒可支持的名稱空間事務(wù)處理速度。但是,這種降級(jí)是可以接受的,因?yàn)榧词笻DFS應(yīng)用程序本質(zhì)上是非常密集的數(shù)據(jù),它們也不是元數(shù)據(jù)密集型的。當(dāng)NameNode重新啟動(dòng)時(shí),它會(huì)選擇最新的一致的FsImage和EditLog來使用。

NameNode機(jī)器是HDFS群集的單點(diǎn)故障。如果NameNode機(jī)器出現(xiàn)故障,則需要手動(dòng)干預(yù)。目前,不支持NameNode軟件自動(dòng)重新啟動(dòng)和故障切換到另一臺(tái)機(jī)器。

快照

快照支持在特定時(shí)刻存儲(chǔ)數(shù)據(jù)副本??煺展δ艿囊环N用法可能是將損壞的HDFS實(shí)例回滾到先前已知的良好時(shí)間點(diǎn)。HDFS目前不支持快照,但將在未來的版本中支持。

數(shù)據(jù)組織

數(shù)據(jù)塊

HDFS旨在支持非常大的文件。與HDFS兼容的應(yīng)用程序是處理大型數(shù)據(jù)集的應(yīng)用程序。這些應(yīng)用程序只寫入其數(shù)據(jù)一次,但他們讀取一次或多次,并要求在流速下滿足這些讀取。HDFS支持在文件上一次寫入多次讀取語義。HDFS使用的典型塊大小為64 MB。因此,HDFS文件被分成64 MB的塊,如果可能的話,每個(gè)塊將駐留在不同的DataNode上。

分期(Staging)

客戶端創(chuàng)建文件的請(qǐng)求不會(huì)立即到達(dá)NameNode。實(shí)際上,HDFS客戶端最初將文件數(shù)據(jù)緩存到臨時(shí)本地文件中。應(yīng)用程序?qū)懭氡煌该鞯刂囟ㄏ虻竭@個(gè)臨時(shí)的本地文件。當(dāng)本地文件累積超過一個(gè)HDFS塊大小的數(shù)據(jù)時(shí),客戶端會(huì)聯(lián)系NameNode。NameNode將文件名插入到文件系統(tǒng)層次結(jié)構(gòu)中,并為其分配一個(gè)數(shù)據(jù)塊。NameNode用DataNode的標(biāo)識(shí)和目標(biāo)數(shù)據(jù)塊響應(yīng)客戶請(qǐng)求。然后客戶端將本地臨時(shí)文件中的數(shù)據(jù)塊刷新到指定的DataNode。當(dāng)文件關(guān)閉時(shí),臨時(shí)本地文件中剩余的未刷新數(shù)據(jù)將傳輸?shù)紻ataNode。客戶端然后告訴NameNode文件已關(guān)閉。此時(shí),NameNode將文件創(chuàng)建操作提交到持久存儲(chǔ)區(qū)。如果NameNode在文件關(guān)閉之前死亡,則文件丟失。

在仔細(xì)考慮在HDFS上運(yùn)行的目標(biāo)應(yīng)用程序后,采用了上述方法。這些應(yīng)用程序需要流式寫入文件。如果客戶端在沒有任何客戶端緩沖的情況下直接寫入遠(yuǎn)程文件,則網(wǎng)絡(luò)速度和網(wǎng)絡(luò)擁塞會(huì)嚴(yán)重影響吞吐量。這種做法并非沒有先例。早期的分布式文件系統(tǒng)(例如<acronym title="安德魯(Andrew)文件系統(tǒng)" style="cursor: help;">AFS</acronym> )使用客戶端緩存來提高性能。POSIX的要求已經(jīng)放寬,以實(shí)現(xiàn)更高的數(shù)據(jù)上傳性能。

復(fù)制流水線

當(dāng)客戶端將數(shù)據(jù)寫入HDFS文件時(shí),首先將數(shù)據(jù)寫入本地文件,如前一節(jié)所述。假設(shè)HDFS文件的復(fù)制因子為3。當(dāng)本地文件累積完整的用戶數(shù)據(jù)塊時(shí),客戶端從NameNode中檢索DataNode列表。該列表包含將承載該塊的副本的DataNode。客戶端然后將數(shù)據(jù)塊刷新到第一個(gè)DataNode。第一個(gè)DataNode開始以小部分(4 KB)接收數(shù)據(jù),將每個(gè)部分寫入其本地存儲(chǔ)庫(kù)并將該部分傳輸?shù)搅斜碇械牡诙€(gè)DataNode。第二個(gè)DataNode反過來開始接收數(shù)據(jù)塊的每個(gè)部分,將該部分寫入其存儲(chǔ)庫(kù),然后將該部分刷新到第三個(gè)DataNode。最后,第三個(gè)DataNode將數(shù)據(jù)寫入其本地存儲(chǔ)庫(kù)。因此,DataNode可以從流水線中的前一個(gè)接收數(shù)據(jù),并且同時(shí)將數(shù)據(jù)轉(zhuǎn)發(fā)到流水線中的下一個(gè)數(shù)據(jù)。因此,數(shù)據(jù)從一個(gè)DataNode流水到下一個(gè)。

無障礙(Accessibility)

HDFS可以通過許多不同的方式從應(yīng)用程序中訪問。從本質(zhì)上講,HDFS為應(yīng)用程序提供了一個(gè)Java API 。此Java API的C語言包裝器也可用。另外,還可以使用HTTP瀏覽器瀏覽HDFS實(shí)例的文件。正在進(jìn)行工作,通過<acronym title="基于Web的分布式創(chuàng)作和版本控制" style="cursor: help;">WebDAV</acronym>協(xié)議公開HDFS。

FS Shell

HDFS允許用戶數(shù)據(jù)以文件和目錄的形式組織。它提供了一個(gè)名為FS shell的命令行界面,可讓用戶與HDFS中的數(shù)據(jù)進(jìn)行交互。這個(gè)命令集的語法類似于用戶已經(jīng)熟悉的其他shell(例如bash,csh)。以下是一些示例操作/命令對(duì):

| 行動(dòng) | 命令 |
| 創(chuàng)建一個(gè)名為/ foodir的目錄 | bin / hadoop dfs -mkdir / foodir |
| 刪除名為/ foodir的目錄 | bin / hadoop dfs -rmr / foodir |
| 查看名為/foodir/myfile.txt的文件的內(nèi)容 | bin / hadoop dfs -cat /foodir/myfile.txt |

FS Shell針對(duì)需要腳本語言與存儲(chǔ)數(shù)據(jù)進(jìn)行交互的應(yīng)用程序。

DFSAdmin

DFSAdmin命令集用于管理HDFS集群。這些是僅由HDFS管理員使用的命令。以下是一些示例操作/命令對(duì):

| 行動(dòng) | 命令 |
| 將群集置于Safemode | bin / hadoop dfsadmin -safemode進(jìn)入 |
| 生成DataNode列表 | bin / hadoop dfsadmin -report |
| 重新投放或停用DataNode(s) | bin / hadoop dfsadmin -refreshNodes |

瀏覽器界面

典型的HDFS安裝將Web服務(wù)器配置為通過可配置的TCP端口公開HDFS名稱空間。這允許用戶使用Web瀏覽器瀏覽HDFS名稱空間并查看其文件的內(nèi)容。

空間回收

文件刪除和取消刪除

當(dāng)文件被用戶或應(yīng)用程序刪除時(shí),它不會(huì)立即從HDFS中刪除。相反,HDFS首先將其重命名為/ trash目錄中的文件。只要文件保持在/垃圾箱中,該文件可以快速恢復(fù)。文件保留在/垃圾箱中一段可配置的時(shí)間。在/ trash中生命期滿后,NameNode將文件從HDFS名稱空間中刪除。刪除文件會(huì)導(dǎo)致與文件關(guān)聯(lián)的塊被釋放。請(qǐng)注意,用戶刪除文件的時(shí)間與HDFS中相應(yīng)增加可用空間的時(shí)間之間可能存在明顯的時(shí)間延遲。

用戶可以在刪除文件后取消刪除文件,只要文件保留在/ trash目錄中即可。如果用戶想要取消刪除他/她已刪除的文件,他/她可以瀏覽/垃圾目錄并檢索文件。/ trash目錄僅包含已刪除文件的最新副本。/ trash目錄就像具有一個(gè)特殊功能的任何其他目錄一樣:HDFS應(yīng)用指定策略自動(dòng)從該目錄中刪除文件。當(dāng)前的默認(rèn)策略是從/垃圾桶中刪除超過6個(gè)小時(shí)的文件。將來,這個(gè)策略將通過一個(gè)定義良好的界面進(jìn)行配置。

降低復(fù)制因子

當(dāng)文件的復(fù)制因子減少時(shí),NameNode選擇可以刪除的多余副本。下一個(gè)Heartbeat將此信息傳輸?shù)紻ataNode。DataNode然后刪除相應(yīng)的塊,并在群集中出現(xiàn)相應(yīng)的可用空間。再一次, setReplication API調(diào)用完成和群集中可用空間的出現(xiàn)之間可能存在時(shí)間延遲。

參考

HDFS Java API: http//hadoop.apache.org/core/docs/current/api/

HDFS源代碼: http//hadoop.apache.org/hdfs/version_control.html

由Dhruba Borthakur提供

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 HDFS是一個(gè)高容錯(cuò)和可部署在廉價(jià)機(jī)器上的系統(tǒng)。HDFS提供高吞吐數(shù)據(jù)能力適合處理大量數(shù)據(jù)。HDFS松...
    盜夢(mèng)者_(dá)56f2閱讀 3,014評(píng)論 0 3
  • 翻譯: http://hadoop.apache.org/docs/stable/hadoop-project-d...
    金剛_30bf閱讀 883評(píng)論 0 2
  • 世間姑娘千千萬,可是卻只有一個(gè)這樣的你。誰說不是呢,世上的每一個(gè)姑娘不管她是有多好,亦或是她有多壞,她都是特別的。...
    青禾姑娘閱讀 447評(píng)論 0 1
  • 在afn請(qǐng)求數(shù)據(jù)時(shí),后臺(tái)往往把請(qǐng)求錯(cuò)誤信息放到HTTP響應(yīng)Body中,我們打印出來的error往往是后臺(tái)服務(wù)器錯(cuò)誤...
    純陽子_閱讀 1,130評(píng)論 0 1
  • 忍冬的青藤上 落滿了厚厚一層安謐 那像是我愛過你的證明 我聽著一首古老的情歌 忘了自己為何流浪 與無數(shù)人迎面 卻都...
    蒲默閱讀 284評(píng)論 0 0

友情鏈接更多精彩內(nèi)容