深度解析Hadoop之HDFS架構(gòu)

Hadoop分布式文件系統(tǒng)(HDFS)是一種分布式文件系統(tǒng)。它與現(xiàn)有的分布式文件系統(tǒng)有許多相似之處。但是,與其他分布式文件系統(tǒng)的差異是值得我們注意的:

? HDFS具有高度容錯(cuò)能力,旨在部署在低成本硬件上。(高容錯(cuò))

? HDFS提供對(duì)數(shù)據(jù)的高吞吐量訪問(wèn),適用于具有海量數(shù)據(jù)集的應(yīng)用程序。(高吞吐量)

? HDFS放寬了一些POSIX要求,以實(shí)現(xiàn)對(duì)文件系統(tǒng)數(shù)據(jù)的流式訪問(wèn)。(流式訪問(wèn))

? HDFS最初是作為Apache Nutch網(wǎng)絡(luò)搜索引擎項(xiàng)目的基礎(chǔ)設(shè)施而構(gòu)建的。HDFS是Apache Hadoop Core項(xiàng)目的一部分。

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

硬件故障檢測(cè):硬件故障是常態(tài)而非例外。Hadoop通常部署在低成本的硬件上,并且通常包含成百上千的服務(wù)器,每個(gè)服務(wù)器都存儲(chǔ)文件系統(tǒng)數(shù)據(jù)的一部分。由于存在大量的組件,并且每個(gè)組件都具有不可忽略(non-trivial )的故障概率,這意味著HDFS的某些組件始終都不起作用。因此,故障檢測(cè)并快速恢復(fù)是HDFS的核心架構(gòu)目標(biāo)。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

流式訪問(wèn):HDFS更適合批處理而不是交互式使用,更加注重?cái)?shù)據(jù)訪問(wèn)的高吞吐量而不是數(shù)據(jù)訪問(wèn)的低延遲。在HDFS上運(yùn)行的應(yīng)用程序需要對(duì)其數(shù)據(jù)集進(jìn)行流式訪問(wèn)。

海量數(shù)據(jù)集:運(yùn)行在HDFS上的應(yīng)用程序具有大型數(shù)據(jù)集,HDFS中的一個(gè)典型文件的大小是g到tb,因此,HDFS被調(diào)優(yōu)為支持大文件。它應(yīng)該提供高聚合數(shù)據(jù)帶寬,并可擴(kuò)展到單個(gè)集群中的數(shù)百個(gè)節(jié)點(diǎn)。它應(yīng)該在一個(gè)實(shí)例中支持?jǐn)?shù)千萬(wàn)個(gè)文件。

一致性模型:HDFS應(yīng)用程序需要一個(gè)一次寫(xiě)入多次讀取的文件訪問(wèn)模型。文件一旦創(chuàng)建、寫(xiě)入和關(guān)閉,除了追加和截?cái)嗖僮魍?,無(wú)需要更改。支持將內(nèi)容追加到文件末尾,但無(wú)法在任意點(diǎn)更新。該假設(shè)簡(jiǎn)化了數(shù)據(jù)一致性問(wèn)題并實(shí)現(xiàn)了高吞吐量數(shù)據(jù)訪問(wèn)。MapReduce應(yīng)用程序或Web爬蟲(chóng)應(yīng)用程序完全適合此模型。

移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)便宜:應(yīng)用程序請(qǐng)求的計(jì)算如果在其操作的數(shù)據(jù)附近執(zhí)行,效率會(huì)高得多。當(dāng)數(shù)據(jù)集的大小很大時(shí)尤其如此。這可以最大限度地減少網(wǎng)絡(luò)擁塞并提高系統(tǒng)的整體吞吐量。因此更好的做法是將計(jì)算遷移到更靠近數(shù)據(jù)所在的位置,而不是將數(shù)據(jù)移動(dòng)到運(yùn)行應(yīng)用程序的位置。HDFS為應(yīng)用程序提供了一些接口,使它們自己更接近數(shù)據(jù)所在的位置。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

跨平臺(tái)和可移植:Hadoop使用Java語(yǔ)言開(kāi)發(fā),使得Hadoop具有良好的跨平臺(tái)性。

NameNode和DataNodes

HDFS具有主/從( master/slave)架構(gòu)。HDFS集群由一個(gè)NameNode和許多DataNode組成,NameNode是一個(gè)主服務(wù)器(master),管理文件系統(tǒng)名稱空間并管理客端對(duì)數(shù)據(jù)的訪問(wèn)(NameNode在Hadoop集群中充當(dāng)u管家/u的角色)。此外集群中每個(gè)節(jié)點(diǎn)通常是一個(gè)DataNode,DataNode管理它們的節(jié)點(diǎn)上存儲(chǔ)的數(shù)據(jù)。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

HDFS公開(kāi)文件系統(tǒng)名稱空間,并允許用戶數(shù)據(jù)存儲(chǔ)在文件中。在內(nèi)部,文件被分成一個(gè)或多個(gè)塊(block),這些塊存儲(chǔ)在DataNode中。NameNode執(zhí)行文件系統(tǒng)名稱空間的相關(guān)操作,如打開(kāi)、關(guān)閉和重命名文件和目錄。它還確定了塊到DataNode的映射(塊存儲(chǔ)到哪個(gè)DataNode中)。數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)服務(wù)來(lái)自文件系統(tǒng)客戶端的讀寫(xiě)請(qǐng)求。數(shù)據(jù)節(jié)點(diǎn)還根據(jù)NameNode的指令執(zhí)行塊創(chuàng)建、刪除和復(fù)制。

深入理解Hadoop之HDFS架構(gòu)

集群中單一NameNode的結(jié)構(gòu)大大簡(jiǎn)化了系統(tǒng)的架構(gòu)。NameNode是所有HDFS元數(shù)據(jù)的仲裁者和管理者,這樣,用戶數(shù)據(jù)永遠(yuǎn)不會(huì)流過(guò)NameNode。

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

HDFS支持傳統(tǒng)的層次型文件組織結(jié)構(gòu)。用戶或者應(yīng)用程序可以創(chuàng)建目錄,然后將文件保存在這些目錄里。文件系統(tǒng)名稱空間的層次結(jié)構(gòu)和大多數(shù)現(xiàn)有的文件系統(tǒng)類似:用戶可以創(chuàng)建、刪除、移動(dòng)或重命名文件。當(dāng)前,HDFS不支持用戶磁盤(pán)配額和訪問(wèn)權(quán)限控制,也不支持硬鏈接和軟鏈接。但是HDFS架構(gòu)并不妨礙實(shí)現(xiàn)這些特性。

NameNode負(fù)責(zé)維護(hù)文件系統(tǒng)的名稱空間,任何對(duì)文件系統(tǒng)名稱空間或?qū)傩缘男薷亩紝⒈籒ameNode記錄下來(lái)。應(yīng)用程序可以設(shè)置HDFS保存的文件的副本數(shù)目。文件副本的數(shù)目稱為文件的副本系數(shù),這個(gè)信息也是由NameNode保存的。

如果想深入了解HDFS文件系統(tǒng)名稱空間可以查看這篇博文:http://leotse90.com/...

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

HDFS被設(shè)計(jì)成能夠在一個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件。它將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊,除了最后一個(gè),所有的數(shù)據(jù)塊都是同樣大小的。為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本。每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變。HDFS中的文件都是一次性寫(xiě)入的,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫(xiě)入者。

NameNode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個(gè)DataNode接收心跳信號(hào)(Heartbeat )和塊狀態(tài)報(bào)告(Blockreport)。

接收到心跳信號(hào)意味著該DataNode節(jié)點(diǎn)工作正常。

塊狀態(tài)報(bào)告包含了一個(gè)該Datanode上所有數(shù)據(jù)塊的列表。

深入理解Hadoop之HDFS架構(gòu)

副本存放: 最最開(kāi)始的一步

副本的存放是HDFS可靠性和性能的關(guān)鍵。優(yōu)化的副本存放策略是HDFS區(qū)分于其他大部分分布式文件系統(tǒng)的重要特性。這種特性需要做大量的調(diào)優(yōu),并需要經(jīng)驗(yàn)的積累。HDFS采用一種稱為機(jī)架感知(rack-aware)的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。目前實(shí)現(xiàn)的副本存放策略只是在這個(gè)方向上的第一步。實(shí)現(xiàn)這個(gè)策略的短期目標(biāo)是驗(yàn)證它在生產(chǎn)環(huán)境下的有效性,觀察它的行為,為實(shí)現(xiàn)更先進(jìn)的策略打下測(cè)試和研究的基礎(chǔ)。

大型HDFS實(shí)例一般運(yùn)行在跨越多個(gè)機(jī)架的計(jì)算機(jī)組成的集群上,不同機(jī)架上的兩臺(tái)機(jī)器之間的通訊需要經(jīng)過(guò)交換機(jī)。在大多數(shù)情況下,同一個(gè)機(jī)架內(nèi)的兩臺(tái)機(jī)器間的帶寬會(huì)比不同機(jī)架的兩臺(tái)機(jī)器間的帶寬大。

通過(guò)一個(gè)機(jī)架感知的過(guò)程,NameNode可以確定每個(gè)DataNode所屬的機(jī)架id。一個(gè)簡(jiǎn)單但沒(méi)有優(yōu)化的策略就是將副本存放在不同的機(jī)架上。這樣可以有效防止當(dāng)整個(gè)機(jī)架失效時(shí)數(shù)據(jù)的丟失,并且允許讀數(shù)據(jù)的時(shí)候充分利用多個(gè)機(jī)架的帶寬。這種策略設(shè)置可以將副本均勻分布在集群中,有利于當(dāng)組件失效情況下的負(fù)載均衡。但是,因?yàn)檫@種策略的一個(gè)寫(xiě)操作需要傳輸數(shù)據(jù)塊到多個(gè)機(jī)架,這增加了寫(xiě)的代價(jià)。

在大多數(shù)情況下,副本系數(shù)是3,HDFS的存放策略是將一個(gè)副本存放在本地機(jī)架的節(jié)點(diǎn)上,一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上,最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。這種策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫(xiě)操作的效率。機(jī)架的錯(cuò)誤遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的錯(cuò)誤少,所以這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和可用性。于此同時(shí),因?yàn)閿?shù)據(jù)塊只放在兩個(gè)(不是三個(gè))不同的機(jī)架上,所以此策略減少了讀取數(shù)據(jù)時(shí)需要的網(wǎng)絡(luò)傳輸總帶寬。在這種策略下,副本并不是均勻分布在不同的機(jī)架上。三分之一的副本在一個(gè)節(jié)點(diǎn)上,三分之二的副本在一個(gè)機(jī)架上,其他副本均勻分布在剩下的機(jī)架中,這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫(xiě)的性能。

副本選擇

為了降低整體的帶寬消耗和讀取延時(shí),HDFS會(huì)盡量讓讀取程序讀取離它最近的副本。如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本,那么就讀取該副本。如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心,那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本。(就近原則)

安全模式

NameNode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱為安全模式的特殊狀態(tài)。處于安全模式的NameNode是不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制的。NameNode從所有的 DataNode接收心跳信號(hào)和塊狀態(tài)報(bào)告。塊狀態(tài)報(bào)告包括了某個(gè)DataNode所有的數(shù)據(jù)塊列表。每個(gè)數(shù)據(jù)塊都有一個(gè)指定的最小副本數(shù)。當(dāng)NameNode檢測(cè)確認(rèn)某個(gè)數(shù)據(jù)塊的副本數(shù)目達(dá)到這個(gè)最小值,那么該數(shù)據(jù)塊就會(huì)被認(rèn)為是副本安全(safely replicated)的;在一定百分比(這個(gè)參數(shù)可配置)的數(shù)據(jù)塊被NameNode檢測(cè)確認(rèn)是安全之后(加上一個(gè)額外的30秒等待時(shí)間),NameNode將退出安全模式狀態(tài)。接下來(lái)它會(huì)確定還有哪些數(shù)據(jù)塊的副本沒(méi)有達(dá)到指定數(shù)目,并將這些數(shù)據(jù)塊復(fù)制到其他DataNode上。

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

NameNode上保存著HDFS的DataNode空間。對(duì)于任何對(duì)文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作,NameNode都會(huì)使用一種稱為EditLog的事務(wù)日志記錄下來(lái)。例如,在HDFS中創(chuàng)建一個(gè)文件,NameNode就會(huì)在Editlog中插入一條記錄來(lái)表示;同樣地,修改文件的副本系數(shù)也將往Editlog插入一條記錄。NameNode在本地操作系統(tǒng)的文件系統(tǒng)中存儲(chǔ)這個(gè)Editlog。整個(gè)文件系統(tǒng)的DataNode空間,包括數(shù)據(jù)塊到文件的映射、文件的屬性等,都存儲(chǔ)在一個(gè)稱為FsImage的文件中,這個(gè)文件也是放在NameNode所在的本地文件系統(tǒng)上。

NameNode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的DataNode空間和文件數(shù)據(jù)塊映射(Blockmap)的映像。這個(gè)關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)得很緊湊,因而一個(gè)有4G內(nèi)存的NameNode足夠支撐大量的文件和目錄。當(dāng)NameNode啟動(dòng)時(shí),它從硬盤(pán)中讀取Editlog和FsImage,將所有Editlog中的事務(wù)作用在內(nèi)存中的FsImage上,并將這個(gè)新版本的FsImage從內(nèi)存中保存到本地磁盤(pán)上,然后刪除舊的Editlog,因?yàn)檫@個(gè)舊的Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程稱為一個(gè)檢查點(diǎn)(checkpoint)。在當(dāng)前實(shí)現(xiàn)中,檢查點(diǎn)只發(fā)生在NameNode啟動(dòng)時(shí),在不久的將來(lái)將實(shí)現(xiàn)支持周期性的檢查點(diǎn)。

Datanode將HDFS數(shù)據(jù)以文件的形式存儲(chǔ)在本地的文件系統(tǒng)中,它并不知道有關(guān)HDFS文件的信息。它把每個(gè)HDFS數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)的一個(gè)單獨(dú)的文件中。Datanode并不在同一個(gè)目錄創(chuàng)建所有的文件,實(shí)際上,它用試探的方法來(lái)確定每個(gè)目錄的最佳文件數(shù)目,并且在適當(dāng)?shù)臅r(shí)候創(chuàng)建子目錄。在同一個(gè)目錄中創(chuàng)建所有的本地文件并不是最優(yōu)的選擇,這是因?yàn)楸镜匚募到y(tǒng)可能無(wú)法高效地在單個(gè)目錄中支持大量的文件。當(dāng)一個(gè)Datanode啟動(dòng)時(shí),它會(huì)掃描本地文件系統(tǒng),產(chǎn)生一個(gè)這些本地文件對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,然后作為報(bào)告發(fā)送到NameNode,這個(gè)報(bào)告就是塊狀態(tài)報(bào)告。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

通訊協(xié)議

所有的HDFS通訊協(xié)議都是建立在TCP/IP協(xié)議之上??蛻舳送ㄟ^(guò)一個(gè)可配置的TCP端口連接到NameNode,通過(guò)ClientProtocol協(xié)議與NameNode交互。而Datanode使用DatanodeProtocol協(xié)議與NameNode交互。一個(gè)遠(yuǎn)程過(guò)程調(diào)用(RPC)模型被抽象出來(lái)封裝ClientProtocol和Datanodeprotocol協(xié)議。在設(shè)計(jì)上,NameNode不會(huì)主動(dòng)發(fā)起RPC,而是響應(yīng)來(lái)自客戶端或 Datanode 的RPC請(qǐng)求。

健壯性

HDFS的主要目標(biāo)就是即使在出錯(cuò)的情況下也要保證數(shù)據(jù)存儲(chǔ)的可靠性。常見(jiàn)的三種出錯(cuò)情況是:NameNode出錯(cuò), Datanode出錯(cuò)和網(wǎng)絡(luò)割裂(network partitions)。

磁盤(pán)數(shù)據(jù)錯(cuò)誤,心跳檢測(cè)和重新復(fù)制

每個(gè)Datanode節(jié)點(diǎn)周期性地向NameNode發(fā)送心跳信號(hào)。網(wǎng)絡(luò)割裂可能導(dǎo)致一部分Datanode跟NameNode失去聯(lián)系。NameNode通過(guò)心跳信號(hào)的缺失來(lái)檢測(cè)這一情況,并將這些近期不再發(fā)送心跳信號(hào)Datanode標(biāo)記為宕機(jī),不會(huì)再將新的IO請(qǐng)求發(fā)給它們。任何存儲(chǔ)在宕機(jī)Datanode上的數(shù)據(jù)將不再有效。Datanode的宕機(jī)可能會(huì)引起一些數(shù)據(jù)塊的副本系數(shù)低于指定值,NameNode不斷地檢測(cè)這些需要復(fù)制的數(shù)據(jù)塊,一旦發(fā)現(xiàn)就啟動(dòng)復(fù)制操作。在下列情況下,可能需要重新復(fù)制:某個(gè)Datanode節(jié)點(diǎn)失效,某個(gè)副本遭到損壞,Datanode上的硬盤(pán)錯(cuò)誤,或者文件的副本系數(shù)增大。

集群均衡

HDFS的架構(gòu)支持?jǐn)?shù)據(jù)均衡策略。如果某個(gè)Datanode節(jié)點(diǎn)上的空閑空間低于特定的臨界點(diǎn),按照均衡策略系統(tǒng)就會(huì)自動(dòng)地將數(shù)據(jù)從這個(gè)Datanode移動(dòng)到其他空閑的Datanode。當(dāng)對(duì)某個(gè)文件的請(qǐng)求突然增加,那么也可能啟動(dòng)一個(gè)計(jì)劃創(chuàng)建該文件新的副本,并且同時(shí)重新平衡集群中的其他數(shù)據(jù)。這些均衡策略目前還沒(méi)有實(shí)現(xiàn)。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

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

從某個(gè)Datanode獲取的數(shù)據(jù)塊有可能是損壞的,損壞可能是由Datanode的存儲(chǔ)設(shè)備錯(cuò)誤、網(wǎng)絡(luò)錯(cuò)誤或者軟件bug造成的。HDFS客戶端軟件實(shí)現(xiàn)了對(duì)HDFS文件內(nèi)容的校驗(yàn)和(checksum)檢查。當(dāng)客戶端創(chuàng)建一個(gè)新的HDFS文件,會(huì)計(jì)算這個(gè)文件每個(gè)數(shù)據(jù)塊的校驗(yàn)和,并將校驗(yàn)和作為一個(gè)單獨(dú)的隱藏文件保存在同一個(gè)HDFSDataNode空間下。當(dāng)客戶端獲取文件內(nèi)容后,它會(huì)檢驗(yàn)從Datanode獲取的數(shù)據(jù)跟相應(yīng)的校驗(yàn)和文件中的校驗(yàn)和是否匹配,如果不匹配,客戶端可以選擇從其他Datanode獲取該數(shù)據(jù)塊的副本。

元數(shù)據(jù)磁盤(pán)錯(cuò)誤

FsImage和Editlog是HDFS的核心數(shù)據(jù)結(jié)構(gòu)。如果這些文件損壞了,整個(gè)HDFS實(shí)例都將失效。因而,NameNode可以配置成支持維護(hù)多個(gè)FsImage和Editlog的副本。任何對(duì)FsImage或者Editlog的修改,都將同步到它們的副本上。這種多副本的同步操作可能會(huì)降低NameNode每秒處理的DataNode空間事務(wù)數(shù)量。然而這個(gè)代價(jià)是可以接受的,因?yàn)榧词笻DFS的應(yīng)用是數(shù)據(jù)密集的,它們也非元數(shù)據(jù)密集的。當(dāng)NameNode重啟的時(shí)候,它會(huì)選取最近的完整的FsImage和Editlog來(lái)使用。

增加故障恢復(fù)能力的另一個(gè)選擇是使用多個(gè)NameNode 在NFS上使用共享存儲(chǔ)或使用分布式編輯日志(稱為Journal)來(lái)啟用高可用性。后者是推薦的方法。

快照

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

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

數(shù)據(jù)塊

HDFS被設(shè)計(jì)成支持大文件,適用HDFS的是那些需要處理大規(guī)模的數(shù)據(jù)集的應(yīng)用。這些應(yīng)用都是只寫(xiě)入數(shù)據(jù)一次,但卻讀取一次或多次,并且讀取速度應(yīng)能滿足流式讀取的需要。HDFS支持文件的“一次寫(xiě)入多次讀取”語(yǔ)義。一個(gè)典型的數(shù)據(jù)塊大小是128MB。因而,HDFS中的文件總是按照128M被切分成不同的塊,每個(gè)塊盡可能地存儲(chǔ)于不同的Datanode中。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)

流水線復(fù)制

當(dāng)客戶端向HDFS文件寫(xiě)入數(shù)據(jù)的時(shí)候,一開(kāi)始是寫(xiě)到本地臨時(shí)文件中。假設(shè)該文件的副本系數(shù)設(shè)置為3,當(dāng)本地臨時(shí)文件累積到一個(gè)數(shù)據(jù)塊的大小時(shí),客戶端會(huì)從NameNode獲取一個(gè)Datanode列表用于存放副本。然后客戶端開(kāi)始向第一個(gè)Datanode傳輸數(shù)據(jù),第一個(gè)Datanode一小部分一小部分(4 KB)地接收數(shù)據(jù),將每一部分寫(xiě)入本地倉(cāng)庫(kù),并同時(shí)傳輸該部分到列表中第二個(gè)Datanode節(jié)點(diǎn)。第二個(gè)Datanode也是這樣,一小部分一小部分地接收數(shù)據(jù),寫(xiě)入本地倉(cāng)庫(kù),并同時(shí)傳給第三個(gè)Datanode。最后,第三個(gè)Datanode接收數(shù)據(jù)并存儲(chǔ)在本地。因此,Datanode能流水線式地從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù),并在同時(shí)轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn),數(shù)據(jù)以流水線的方式從前一個(gè)Datanode復(fù)制到下一個(gè)。

可訪問(wèn)性

可以通過(guò)多種不同方式從應(yīng)用程序訪問(wèn)HDFS。本地,HDFS 為應(yīng)用程序提供了FileSystem Java API。一本Java API的C語(yǔ)言包裝和REST API也是可用的。此外,還有HTTP瀏覽器,也可用于瀏覽HDFS實(shí)例的文件。通過(guò)使用NFS網(wǎng)關(guān),HDFS可以作為客戶端本地文件系統(tǒng)的一部分進(jìn)行安裝。

FS Shell

HDFS以文件和目錄的形式組織用戶數(shù)據(jù)。它提供了一個(gè)命令行的接口(FS Shell)讓用戶與HDFS中的數(shù)據(jù)進(jìn)行交互。命令的語(yǔ)法和用戶熟悉的其他shell(例如 bash, csh)工具類似。下面是一些動(dòng)作/命令的示例:

? 深入理解Hadoop之HDFS架構(gòu)

? FS shell適用于需要腳本語(yǔ)言與存儲(chǔ)數(shù)據(jù)交互的應(yīng)用程序。

? DFSAdmin

? 典型的HDFS安裝配置Web服務(wù)器以通過(guò)可配置的TCP端口公開(kāi)HDFS命名空間。這允許用戶使用Web瀏覽器導(dǎo)航HDFS命名空間并查看其文件的內(nèi)容。

? 深入理解Hadoop之HDFS架構(gòu)

? 存儲(chǔ)空間回收

? 文件的刪除和恢復(fù)

如果啟用了回收站配置,當(dāng)用戶或應(yīng)用程序刪除某個(gè)文件時(shí),這個(gè)文件并沒(méi)有立刻從HDFS中刪除。實(shí)際上,HDFS會(huì)將這個(gè)文件重命名轉(zhuǎn)移到/trash目錄(/user/username/.Trash)。只要文件還在/trash目錄中,該文件就可以被迅速地恢復(fù)。文件在/trash中保存的時(shí)間是可配置的,當(dāng)超過(guò)這個(gè)時(shí)間時(shí),NameNode就會(huì)將該文件從DataNode空間中刪除。刪除文件會(huì)使得該文件相關(guān)的數(shù)據(jù)塊被釋放。注意,從用戶刪除文件到HDFS空閑空間的增加之間會(huì)有一定時(shí)間的延遲。

以下是一個(gè)示例,它將顯示FS Shell如何從HDFS中刪除文件。我們?cè)谀夸沝elete下創(chuàng)建了2個(gè)文件(test1和test2)

$ hadoop fs -mkdir -p delete/test1

$ hadoop fs -mkdir -p delete/test2

$ hadoop fs -ls delete/

Found 2 items

drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:39 delete/test1

drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:40 delete/test2

我們將刪除文件test1。下面的注釋顯示該文件已移至/trash目錄。

$ hadoop fs -rm -r delete/test1

Moved: hdfs://localhost:8020/user/hadoop/delete/test1 to trash at: hdfs://localhost:8020/user/hadoop/.Trash/Current

現(xiàn)在我們將使用skipTrash選項(xiàng)刪除該文件,該選項(xiàng)不會(huì)將文件發(fā)送到Trash。它將從HDFS中完全刪除。

$ hadoop fs -rm -r -skipTrash

delete/test2 Deleted delete/test2

我們現(xiàn)在可以看到Trash目錄只包含文件test1。

$ hadoop fs -ls .Trash/Current/user/hadoop/delete/

Found 1 items

drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:39 .Trash/Current/user/hadoop/delete/test1

因此文件test1進(jìn)入垃圾箱并永久刪除文件test2。

減少副本系數(shù)

當(dāng)一個(gè)文件的副本系數(shù)被減小后,NameNode會(huì)選擇過(guò)剩的副本刪除。下次心跳檢測(cè)時(shí)會(huì)將該信息傳遞給Datanode。Datanode遂即移除相應(yīng)的數(shù)據(jù)塊,集群中的空閑空間加大。同樣,在調(diào)用setReplication API結(jié)束和集群中空閑空間增加間會(huì)有一定的延遲。

結(jié)語(yǔ)

感謝您的觀看,如有不足之處,歡迎批評(píng)指正。

如果有對(duì)大數(shù)據(jù)感興趣的小伙伴或者是從事大數(shù)據(jù)的老司機(jī)可以加群:

658558542? ??

里面整理了一大份學(xué)習(xí)資料,全都是些干貨,包括大數(shù)據(jù)技術(shù)入門,海量數(shù)據(jù)高級(jí)分析語(yǔ)言,海量數(shù)據(jù)存儲(chǔ)分布式存儲(chǔ),以及海量數(shù)據(jù)分析分布式計(jì)算等部分,送給每一位大數(shù)據(jù)小伙伴,這里不止是小白聚集地,還有大牛在線解答!歡迎初學(xué)和進(jìn)階中的小伙伴一起進(jìn)群學(xué)習(xí)交流,共同進(jìn)步!

最后祝福所有遇到瓶頸的大數(shù)據(jù)程序員們突破自己,祝福大家在往后的工作與面試中一切順利。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容