Hadoop分布式文件系統(tǒng)hadoop分布式文件系統(tǒng)_第1頁
Hadoop分布式文件系統(tǒng)hadoop分布式文件系統(tǒng)_第2頁
Hadoop分布式文件系統(tǒng)hadoop分布式文件系統(tǒng)_第3頁
Hadoop分布式文件系統(tǒng)hadoop分布式文件系統(tǒng)_第4頁
Hadoop分布式文件系統(tǒng)hadoop分布式文件系統(tǒng)_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Hadoop大數(shù)據(jù)處理實(shí)戰(zhàn)第4章Hadoop分布式文件系統(tǒng)本章導(dǎo)讀Hadoop分布式文件系統(tǒng)(HDFS)是Hadoop體系中數(shù)據(jù)存儲(chǔ)管理的基礎(chǔ)。它是一個(gè)高度容錯(cuò)的系統(tǒng),能檢測(cè)和應(yīng)對(duì)硬件故障,可在低成本的通用硬件上運(yùn)行。它簡(jiǎn)化了文件的一致性模型,通過流式數(shù)據(jù)訪問,可為帶有大型數(shù)據(jù)集的應(yīng)用程序提供高效的海量數(shù)據(jù)存儲(chǔ)服務(wù)。學(xué)習(xí)目標(biāo)020304了解HDFS的設(shè)計(jì)目標(biāo)和不足。熟悉HDFS的體系結(jié)構(gòu)。了解HDFS的數(shù)據(jù)錯(cuò)誤與恢復(fù)手段。理解HDFS的運(yùn)行機(jī)制和工作流程。掌握HDFS的命令行操作和JavaAPI操作。01HDFS概述數(shù)據(jù)錯(cuò)誤與恢復(fù)02HDFS的運(yùn)行機(jī)制03目錄CONTENTSHDFS的工作流程04HDFS的基本操作0501HDFS概述HDFS概述HDFS是一個(gè)支持海量數(shù)據(jù)存儲(chǔ)的分布式文件系統(tǒng),它允許用戶將成百上千的計(jì)算機(jī)組成存儲(chǔ)集群,并將這些計(jì)算機(jī)劃分成元數(shù)據(jù)節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)。集群中各節(jié)點(diǎn)之間通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交互,從而形成一個(gè)跨網(wǎng)絡(luò)的文件系統(tǒng)。網(wǎng)絡(luò)編程的復(fù)雜性和網(wǎng)絡(luò)傳輸?shù)牟豢煽啃?,使得HDFS比普通磁盤文件系統(tǒng)更加復(fù)雜。HDFS概述4.1.1HDFS的設(shè)計(jì)目標(biāo)和不足HDFS的設(shè)計(jì)目標(biāo)包括以下幾點(diǎn):1.HDFS的設(shè)計(jì)目標(biāo)(1)支持超大文件存儲(chǔ)。HDFS能夠存儲(chǔ)GB級(jí)乃至TB級(jí)的超大文件,如今已存在支持PB級(jí)文件存儲(chǔ)的Hadoop集群。(2)采用write-once-read-many(一次寫入多次讀?。┰L問模型。HDFS對(duì)數(shù)據(jù)文件采取一次性寫入、多次讀取的方式,即HDFS文件一經(jīng)創(chuàng)建、寫入和關(guān)閉之后就不能再修改。需要注意的是,HDFS在同一時(shí)刻僅支持一個(gè)“寫入者”。此外,隨著Hadoop版本的升級(jí),HDFS的寫操作已支持使用append方式在文件末尾追加數(shù)據(jù)。HDFS概述(3)具有故障檢測(cè)和快速自動(dòng)恢復(fù)功能。HDFS系統(tǒng)包含了成百上千個(gè)存儲(chǔ)節(jié)點(diǎn),并且這些節(jié)點(diǎn)都是一些廉價(jià)的計(jì)算機(jī)。顯然,對(duì)于如此多的計(jì)算機(jī)而言,個(gè)別計(jì)算機(jī)出現(xiàn)硬件故障實(shí)屬正常。有鑒于此,故障檢測(cè)和快速自動(dòng)恢復(fù)就成為HDFS的核心設(shè)計(jì)目標(biāo),從而既保證了集群的容錯(cuò)性,又保證了數(shù)據(jù)的完整性。(4)采用流式數(shù)據(jù)訪問。為了獲得高吞吐量的數(shù)據(jù)訪問,HDFS上的應(yīng)用主要采用流式數(shù)據(jù)訪問方式,即邊收集數(shù)據(jù)邊處理數(shù)據(jù)。因此,HDFS適用于批量數(shù)據(jù)處理,而非用戶交互式數(shù)據(jù)處理。(5)支持移動(dòng)計(jì)算。如果將應(yīng)用程序請(qǐng)求的計(jì)算在其操作的數(shù)據(jù)附近執(zhí)行,而不是將數(shù)據(jù)移動(dòng)到運(yùn)行應(yīng)用程序的位置,可以極大地減少網(wǎng)絡(luò)擁塞并提高系統(tǒng)的整體吞吐量,從而提高計(jì)算效率,尤其是當(dāng)數(shù)據(jù)文件很大時(shí)提升效果更加明顯。此外,HDFS還為應(yīng)用程序提供了移動(dòng)計(jì)算的接口。HDFS概述HDFS同時(shí)也存在以下幾點(diǎn)不足:2.HDFS的不足(1)不適合處理低延遲數(shù)據(jù)訪問。HDFS主要用于海量數(shù)據(jù)的批量處理,且通過采用流式數(shù)據(jù)訪問方式獲得了數(shù)據(jù)的高吞吐率,但這意味著HDFS不適合處理低延遲的數(shù)據(jù)訪問請(qǐng)求。(2)無法高效存儲(chǔ)大量小文件。小文件是指小于HDFS上最小存儲(chǔ)單位的文件。如果HDFS中存儲(chǔ)大量的小文件,會(huì)使得在集群中進(jìn)行數(shù)據(jù)計(jì)算時(shí)出現(xiàn)數(shù)據(jù)傾斜問題(即數(shù)據(jù)在計(jì)算時(shí)分散度不夠,導(dǎo)致大量的數(shù)據(jù)集中到一臺(tái)或多臺(tái)計(jì)算機(jī)上,使得這些計(jì)算機(jī)的計(jì)算速度遠(yuǎn)遠(yuǎn)低于平均計(jì)算速度,計(jì)算過程也將變得緩慢)。不過,可以通過合并小文件來解決此類問題。HDFS概述(3)不支持多用戶寫入和任意修改文件。HDFS采用了“一次寫入多次讀取”模式,也就是說,用戶不能對(duì)HDFS上的數(shù)據(jù)進(jìn)行隨機(jī)寫操作。此外,HDFS不支持多個(gè)“寫入者”同時(shí)操作數(shù)據(jù),也不支持在文件的任意位置進(jìn)行寫操作以修改文件內(nèi)容。如果必須修改HDFS文件,用戶可以將該文件下載到本地,重新編輯后再上傳到HDFS中。HDFS概述4.1.2HDFS的體系結(jié)構(gòu)HDFS的核心組件是NameNode和DataNode。它是一個(gè)主/從(master/slave)架構(gòu)的系統(tǒng),即一個(gè)HDFS集群由一個(gè)NameNode和若干DataNode組成。其中,NameNode(元數(shù)據(jù)節(jié)點(diǎn))為主節(jié)點(diǎn),DataNode(數(shù)據(jù)節(jié)點(diǎn))為從節(jié)點(diǎn)。HDFS的體系結(jié)構(gòu)HDFS概述1.block在計(jì)算機(jī)中,每個(gè)物理磁盤都包含大量磁盤數(shù)據(jù)塊。磁盤數(shù)據(jù)塊是磁盤讀寫的最小單位,并且當(dāng)文件系統(tǒng)進(jìn)行文件讀寫時(shí)只能操作整數(shù)倍磁盤數(shù)據(jù)塊大小的數(shù)據(jù)。與普通文件系統(tǒng)類似,HDFS也采用了塊(block)的概念。HDFS的數(shù)據(jù)塊大小默認(rèn)為128MB(Hadoop1.x為64MB),顯然,這比大小通常為512B的磁盤數(shù)據(jù)塊要大得多。HDFS概述在HDFS中,數(shù)據(jù)文件按塊進(jìn)行存儲(chǔ)可以帶來如下好處:(1)可以存儲(chǔ)任意大小的數(shù)據(jù)文件,不用再受單個(gè)節(jié)點(diǎn)磁盤容量大小的限制。例如,在單個(gè)節(jié)點(diǎn)存儲(chǔ)100TB甚至10PB的文件幾乎是不可能的,但HDFS采用物理切塊的設(shè)計(jì),可以將這些文件數(shù)據(jù)切分成多個(gè)block,分別存儲(chǔ)在集群中的各個(gè)節(jié)點(diǎn)上。(2)簡(jiǎn)化了文件存儲(chǔ)子系統(tǒng)的設(shè)計(jì),尤其是簡(jiǎn)化了存儲(chǔ)系統(tǒng)的管理,它將元數(shù)據(jù)信息和文件數(shù)據(jù)信息分開存儲(chǔ)。(3)有利于實(shí)現(xiàn)分布式文件系統(tǒng)的容錯(cuò)性。在HDFS中,一個(gè)數(shù)據(jù)文件可能被切分成多個(gè)block,存儲(chǔ)在不同的DataNode上,并且block在集群中保存了多個(gè)副本。當(dāng)操作HDFS數(shù)據(jù)時(shí),如果出現(xiàn)節(jié)點(diǎn)故障,就可以從其他節(jié)點(diǎn)上讀取副本。HDFS概述(4)有利于實(shí)現(xiàn)負(fù)載均衡并提高集群可靠性。如果某個(gè)DataNode上的剩余空間低于特定的臨界點(diǎn),按照均衡策略,系統(tǒng)會(huì)自動(dòng)地將數(shù)據(jù)從這個(gè)DataNode移動(dòng)到其他空閑的DataNode上。此外,由于HDFS中的block副本被分布在不同的機(jī)架上,即使丟失某個(gè)機(jī)架,也不會(huì)影響集群的正常運(yùn)行,這就大大提高了集群的可靠性。與此同時(shí),Hadoop的故障檢測(cè)和快速自動(dòng)恢復(fù)功能會(huì)及時(shí)將block副本數(shù)量恢復(fù)到正常水平。HDFS概述2.NameNode和SecondaryNameNode(1)NameNode。NameNode管理著HDFS文件系統(tǒng)的命名空間(namespace),其實(shí)就是HDFS的目錄結(jié)構(gòu)。用戶可以利用HDFS命令或者在客戶端通過操作請(qǐng)求,來創(chuàng)建、刪除、移動(dòng)和重命名HDFS文件。NameNode上存儲(chǔ)的元數(shù)據(jù)信息包括:①文件名、目錄名及其層級(jí)關(guān)系;②文件目錄的所有者及其權(quán)限;③每個(gè)文件由哪些數(shù)據(jù)塊組成;④數(shù)據(jù)塊到DataNode的映射信息,如數(shù)據(jù)塊存放在哪些DataNode上、每個(gè)DataNode上保存了哪些數(shù)據(jù)塊等。HDFS概述元數(shù)據(jù)信息可被持久化到本地磁盤的兩個(gè)文件中,分別是fsimage(元數(shù)據(jù)鏡像文件)和edits(事務(wù)日志文件)。fsimage存儲(chǔ)著文件系統(tǒng)的所有命名空間信息(如文件系統(tǒng)所有目錄、文件信息及數(shù)據(jù)塊的索引等);edits存儲(chǔ)著HDFS數(shù)據(jù)的事務(wù)操作日志(如創(chuàng)建一個(gè)HDFS文件、修改HDFS文件的副本系數(shù)等操作記錄)。在啟動(dòng)NameNode時(shí),它首先會(huì)將fsimage加載到內(nèi)存中,在系統(tǒng)運(yùn)行期間,所有對(duì)NameNode的操作也都保存在內(nèi)存中,同時(shí)為了防止數(shù)據(jù)丟失,這些操作又會(huì)不斷被持久化到本地edits文件中。NameNode處于正常運(yùn)行狀態(tài)時(shí),HDFS的所有更新操作都被寫入edits文件。如果直接寫入fsimage文件(一般都很大),會(huì)使系統(tǒng)的運(yùn)行速度變慢。隨著HDFS的更新操作不斷執(zhí)行,edits文件也會(huì)變得越來越大。雖然edits的文件大小對(duì)系統(tǒng)不會(huì)有明顯影響,但是NameNode節(jié)點(diǎn)的重啟過程將會(huì)變得非常緩慢。HDFS概述(2)SecondaryNameNode。SecondaryNameNode(NameNode的輔助者)可以解決edits文件過大的問題,縮短N(yùn)ameNode的重啟時(shí)間,它主要用于對(duì)fsimage和edits進(jìn)行定期合并。由于合并過程中需要消耗內(nèi)存,因此,系統(tǒng)通常將SecondaryNameNode和NameNode放在不同的節(jié)點(diǎn)上。SecondaryNameNode實(shí)際上是通過在文件系統(tǒng)中設(shè)置一個(gè)檢查點(diǎn)(checkpoint)來幫助NameNode管理元數(shù)據(jù),從而使NameNode能夠快速、高效地工作。但是,它并非第二個(gè)NameNode,僅是NameNode的一個(gè)輔助工具。SecondaryNameNode不僅提升了集群性能,還保存了NameNode的元數(shù)據(jù)信息,這在一定程度上提高了元數(shù)據(jù)的安全性和可靠性。HDFS概述3.DataNodeDataNode上存儲(chǔ)著HDFS文件的真實(shí)數(shù)據(jù),且一個(gè)DataNode可以存儲(chǔ)多個(gè)block。每個(gè)block會(huì)在多個(gè)DataNode上存儲(chǔ)副本,但每個(gè)DataNode上只存儲(chǔ)一個(gè)block副本。DataNode負(fù)責(zé)為客戶端或NameNode提供數(shù)據(jù)的檢索和讀寫服務(wù),并通過“心跳”(Heartbeats)定期向NameNode發(fā)送自己的block列表信息。一般情況下,DataNode從磁盤讀取數(shù)據(jù)塊。但對(duì)于頻繁訪問的block,系統(tǒng)會(huì)將其緩存在DataNode的內(nèi)存中。HDFS概述向Hadoop集群中增加新的DataNode節(jié)點(diǎn)時(shí),會(huì)導(dǎo)致HDFS文件分布不均衡。此外,隨著HDFS不斷地運(yùn)行,也會(huì)出現(xiàn)HDFS文件分布不均衡的情況,這樣一來,集群就不能充分利用系統(tǒng)資源了。均衡器作為Hadoop的守護(hù)進(jìn)程,可以將block副本從高負(fù)載的DataNode移動(dòng)到使用率較低的DataNode(即在遵循block的副本機(jī)制的前提下,重新調(diào)整block的分布),以達(dá)到集群均衡的目的。注意,這里的均衡是一個(gè)相對(duì)均衡,即每個(gè)DataNode節(jié)點(diǎn)的磁盤使用率和整個(gè)集群的資源使用率均小于指定的閾值。在集群中啟用均衡器

(balancer)HDFS概述在集群主節(jié)點(diǎn)的“/opt/programs/hadoop-2.7.6/sbin”目錄下,存在一個(gè)balancer可執(zhí)行文件“start-balancer.sh”,通過執(zhí)行以下命令可以運(yùn)行balancer程序(用戶可以隨時(shí)通過執(zhí)行“stop-balancer.sh”命令停止均衡):#start-balancer.sh-threshold8其中,“-threshold8”參數(shù)用于設(shè)定集群的均衡閾值為8%,其默認(rèn)值為10%。此外,由于balancer進(jìn)程運(yùn)行于集群的后臺(tái),所以并不會(huì)增加集群的運(yùn)行負(fù)擔(dān)。在配置文件hdfs-site.xml中,還可以設(shè)置在DataNode之間轉(zhuǎn)移block時(shí)占用的資源帶寬大小,即設(shè)置dfs.balance.bandwidthPerSec參數(shù)(默認(rèn)值為1MB)。02數(shù)據(jù)錯(cuò)誤與恢復(fù)數(shù)據(jù)錯(cuò)誤與恢復(fù)HDFS的主要目標(biāo)是即使在出錯(cuò)的情況下也要保證數(shù)據(jù)存儲(chǔ)的可靠性。常見的出錯(cuò)情況包括block損壞、NameNode錯(cuò)誤、DataNode錯(cuò)誤等,HDFS提供了多種錯(cuò)誤恢復(fù)手段。數(shù)據(jù)錯(cuò)誤與恢復(fù)4.2.1block損壞處理網(wǎng)絡(luò)傳輸錯(cuò)誤和機(jī)器硬件故障等因素會(huì)造成數(shù)據(jù)損壞??蛻舳嗽谧x取文件時(shí)會(huì)對(duì)每個(gè)讀取的block進(jìn)行校驗(yàn),如果校驗(yàn)出錯(cuò),客戶端就會(huì)請(qǐng)求讀取其他DataNode上的block副本,并向NameNode報(bào)告該block存在問題,然后NameNode會(huì)重新復(fù)制該block。每一個(gè)DataNode都會(huì)開啟一個(gè)塊掃描進(jìn)程(DataBlockScanner),來定期驗(yàn)證其存儲(chǔ)的block的正確性,并將驗(yàn)證錯(cuò)誤的block交給NameNode進(jìn)行處理。數(shù)據(jù)錯(cuò)誤與恢復(fù)4.2.2NameNode和DataNode錯(cuò)誤處理NameNode上保存了元數(shù)據(jù)信息,如果NameNode節(jié)點(diǎn)損壞,HDFS中的所有文件都會(huì)丟失,并且用戶也不能根據(jù)DataNode上的block重新構(gòu)建HDFS文件。因此,確保NameNode的容錯(cuò)性是十分重要的。通常,可以采用以下3種方法來保證NameNode元數(shù)據(jù)信息的安全。

1將NameNode的元數(shù)據(jù)信息持久化到本地磁盤并同步到NFS上,但這種方法會(huì)因?yàn)榫W(wǎng)絡(luò)帶寬等原因而容易造成元數(shù)據(jù)丟失。數(shù)據(jù)錯(cuò)誤與恢復(fù)

2在HDFS集群中運(yùn)行一個(gè)SecondaryNameNode,當(dāng)NameNode節(jié)點(diǎn)宕機(jī)時(shí),可以利用SecondaryNameNode保存的元數(shù)據(jù)信息進(jìn)行系統(tǒng)恢復(fù)。SecondaryNameNode備份的元數(shù)據(jù)信息總是滯后于NameNode,所以這種方法在NameNode節(jié)點(diǎn)失效后難免會(huì)丟失部分?jǐn)?shù)據(jù)信息。

3在HDFS集群中啟動(dòng)主(active)、備(standby)兩個(gè)NameNode。其中,standbyNameNode轉(zhuǎn)存了activeNameNode的元數(shù)據(jù)信息,并且這種方式是同步的。即使activeNameNode發(fā)生硬件故障,集群也能快速實(shí)現(xiàn)故障轉(zhuǎn)移。當(dāng)DataNode節(jié)點(diǎn)發(fā)生硬件故障或者斷網(wǎng)時(shí),該節(jié)點(diǎn)將無法接收到NameNode的數(shù)據(jù)處理請(qǐng)求,并且該節(jié)點(diǎn)的數(shù)據(jù)同時(shí)會(huì)被NameNode標(biāo)記為不可讀。并且,DataNode節(jié)點(diǎn)錯(cuò)誤可能會(huì)導(dǎo)致集群中的副本系數(shù)小于指定值。當(dāng)NameNode周期性地檢查數(shù)據(jù)副本時(shí),一旦發(fā)現(xiàn)這種情況,就會(huì)立即啟動(dòng)復(fù)制操作。03HDFS的運(yùn)行機(jī)制HDFS的運(yùn)行機(jī)制HDFS的運(yùn)行機(jī)制主要包括副本機(jī)制、心跳機(jī)制、副本放置與機(jī)架感知策略、Federation機(jī)制、HA機(jī)制、安全模式、垃圾回收等內(nèi)容。HDFS的運(yùn)行機(jī)制4.3.1副本機(jī)制為了保證集群的容錯(cuò)性和可用性,HDFS采用了數(shù)據(jù)冗余存儲(chǔ)方式,即一個(gè)數(shù)據(jù)可以保存多個(gè)副本,并且這些副本會(huì)分別存儲(chǔ)在不同的DataNode上。block副本數(shù)是可以配置的,并且它既可以在創(chuàng)建文件時(shí)指定,也可以在創(chuàng)建文件后修改。DataNode按照NameNode的命令進(jìn)行block的創(chuàng)建、復(fù)制和刪除等操作。HDFS數(shù)據(jù)冗余存儲(chǔ)示意圖HDFS的運(yùn)行機(jī)制

…………

HDFS的數(shù)據(jù)冗余存儲(chǔ)方式具有多種優(yōu)勢(shì)。如果多個(gè)客戶端同時(shí)訪問同一個(gè)數(shù)據(jù)文件,就可以讓這些客戶端分別從不同的block副本讀取數(shù)據(jù),從而加快數(shù)據(jù)傳輸速度并提升數(shù)據(jù)的可靠性,有效避免因DataNode故障造成數(shù)據(jù)丟失的情況。由于集群中DataNode是通過網(wǎng)絡(luò)通信進(jìn)行數(shù)據(jù)傳輸?shù)?,?dāng)進(jìn)行block副本復(fù)制時(shí),它還可以檢查數(shù)據(jù)傳輸時(shí)是否出現(xiàn)錯(cuò)誤。HDFS的運(yùn)行機(jī)制4.3.2心跳機(jī)制DataNode通過“心跳”(Heartbeats)將block信息報(bào)告給NameNode,這里的“心跳”是一種形象化描述,指的是不間斷地發(fā)送一個(gè)自定義結(jié)構(gòu)體(“心跳包”或“心跳幀”)來證明自己節(jié)點(diǎn)的有效性。NameNode啟動(dòng)后,會(huì)等待所有DataNode的“心跳”,而DataNode啟動(dòng)后,會(huì)主動(dòng)連接NameNode,并在一定間隔(默認(rèn)為3s)主動(dòng)向NameNode發(fā)送一個(gè)“心跳”,報(bào)告自己的狀態(tài)信息,然后NameNode通過這個(gè)“心跳”向DataNode下達(dá)命令。如果由于硬件故障或網(wǎng)絡(luò)問題,NameNode長(zhǎng)時(shí)間未收到某個(gè)DataNode的“心跳”,NameNode將判定該DataNode為宕機(jī),然后檢查該DataNode上的block副本數(shù)據(jù)并備份到其他的DataNode節(jié)點(diǎn)上。HDFS的運(yùn)行機(jī)制4.3.3副本放置與機(jī)架感知策略一個(gè)集群中往往存在多個(gè)機(jī)架,且每個(gè)機(jī)架上又放置了多個(gè)DataNode,而每個(gè)DataNode上又保存了多個(gè)文件的block副本。另外,NameNode上的元數(shù)據(jù)存儲(chǔ)著每個(gè)DataNode所屬的機(jī)架ID。那么,如何分配文件的block副本到集群中的DataNode上呢?假設(shè)將HDFS文件的副本數(shù)量配置為3,那么每個(gè)block副本會(huì)被放置到3個(gè)不同的DataNode上。其中,有兩個(gè)block副本被放置到同一個(gè)機(jī)架的不同DataNode上,而第3個(gè)block副本被放置到另一個(gè)機(jī)架的DataNode上。block副本放置策略及復(fù)制過程HDFS的運(yùn)行機(jī)制block副本的放置過程如下:如果客戶端發(fā)起寫操作請(qǐng)求,那么就在客戶端所在的節(jié)點(diǎn)上放置第1個(gè)副本(實(shí)現(xiàn)就近寫)。如果是來自集群外部的寫操作請(qǐng)求,就隨機(jī)選擇一個(gè)能夠滿足存儲(chǔ)要求且不忙的DataNode放置第1個(gè)副本。第2個(gè)副本是從機(jī)架1的DataNode1上復(fù)制到同一個(gè)機(jī)架的DataNode3上。在機(jī)架2上隨機(jī)選擇一個(gè)DataNode放置第3個(gè)副本。在本例中,第3個(gè)副本是從DataNode3上復(fù)制到DataNode6上。HDFS的運(yùn)行機(jī)制相對(duì)于將副本均勻分布在機(jī)架中的策略,這種副本放置策略對(duì)集群性能有很大的提升。例如,它減少了機(jī)架間的數(shù)據(jù)傳輸;在不損害數(shù)據(jù)可靠性和讀取性能的情況下,它既兼顧了寫操作的效率,又充分利用了多個(gè)機(jī)架的帶寬,從而減少了讀取數(shù)據(jù)時(shí)所需要的網(wǎng)絡(luò)傳輸總帶寬。由于副本的存放位置會(huì)影響HDFS的可靠性和性能,HDFS采用了一種稱為機(jī)架感知(rack-aware)的策略來提高數(shù)據(jù)的可靠性,并提升網(wǎng)絡(luò)帶寬的利用率。這樣一來,即使一個(gè)機(jī)架發(fā)生故障,由于其他機(jī)架上的副本仍然是可用的,也不會(huì)影響到數(shù)據(jù)的可靠性。另外,當(dāng)讀取數(shù)據(jù)時(shí),應(yīng)用程序可以在多個(gè)機(jī)架上同時(shí)進(jìn)行讀取操作,這種并行處理方法也大大提高了數(shù)據(jù)的讀取速度。HDFS的運(yùn)行機(jī)制4.3.4Federation機(jī)制對(duì)于一個(gè)存儲(chǔ)著大量文件的超大集群來說,NameNode的內(nèi)存中需要保存每個(gè)文件的元數(shù)據(jù)信息,那么計(jì)算機(jī)的內(nèi)存就成了NameNode的瓶頸。于是,在Hadoop2.x引入了HDFSFederation(聯(lián)邦)機(jī)制,它允許集群通過橫向擴(kuò)展的方式解決NameNode的瓶頸問題,即增加NameNode的數(shù)量。在Federation機(jī)制中,每個(gè)NameNode分別管理文件系統(tǒng)命名空間的一部分(稱為命名空間卷)。各命名空間卷中分別存儲(chǔ)了命名空間的元數(shù)據(jù),以及在命名空間中的所有文件數(shù)據(jù)塊的塊池(blockpool)。同時(shí),各命名空間卷是相互獨(dú)立的,互不影響且互不通信。此外,集群中的所有DataNode都必須注冊(cè)到各個(gè)NameNode。Federation機(jī)制并沒有完全解決單點(diǎn)故障問題。雖然集群中存在多個(gè)NameNode和多個(gè)命名空間,但仍然存在單點(diǎn)故障問題。如果其中某個(gè)NameNode失效了,那么它所管理的文件將不能訪問。HDFS的運(yùn)行機(jī)制4.3.5HA機(jī)制造成集群不可用的原因主要有兩個(gè):NameNode節(jié)點(diǎn)宕機(jī),導(dǎo)致整個(gè)集群不可用,直到重啟NameNode節(jié)點(diǎn)之后方可使用;計(jì)劃內(nèi)的NameNode節(jié)點(diǎn)軟件或硬件升級(jí),導(dǎo)致集群在短時(shí)間內(nèi)不可用;Hadoop2.x允許運(yùn)行主(active)、備(standby)兩個(gè)NameNode,從而可以在NameNode節(jié)點(diǎn)出現(xiàn)故障或維護(hù)時(shí),快速啟用備用狀態(tài)的NameNode節(jié)點(diǎn),以確保集群正常運(yùn)行。HDFS的運(yùn)行機(jī)制在雙NameNode的Hadoop分布式集群中,分別處于active和standby狀態(tài)的兩個(gè)NameNode節(jié)點(diǎn)保證了HDFS的高可用性(HA)。activeNameNode負(fù)責(zé)HDFS集群的所有操作,而standbyNameNode作為備用。一旦activeNameNode發(fā)生故障,standbyNameNode可以快速切換并恢復(fù)故障。standbyNameNode的狀態(tài)和activeNameNode始終保持同步(元數(shù)據(jù)信息保持一致),它們之間通過JournalNode守護(hù)進(jìn)程進(jìn)行通信。standbyNameNode同樣保存了block的位置信息,并且DataNode在通過心跳機(jī)制發(fā)送block信息給activeNameNode的同時(shí),也會(huì)將block信息發(fā)送給standbyNameNode。HDFS的運(yùn)行機(jī)制4.3.6安全模式當(dāng)NameNode啟動(dòng)時(shí),集群會(huì)自動(dòng)進(jìn)入安全模式,在該模式下,NameNode會(huì)檢查block的完整性。安全模式可以保證數(shù)據(jù)塊的安全性,它是Hadoop集群的一種保護(hù)模式。此外,安全模式還是一種只讀模式,在該模式下,用戶既不能對(duì)命名空間進(jìn)行任何修改,也不能創(chuàng)建、復(fù)制、追加和刪除數(shù)據(jù),但是可以執(zhí)行查看目錄及文件、下載文件等操作。HDFS的運(yùn)行機(jī)制在正常情況下,當(dāng)NameNode完成啟動(dòng)后(額外延遲30s)就會(huì)退出安全模式。但是,如果DataNode丟失的數(shù)據(jù)塊超過設(shè)定的值,集群就會(huì)一直處于安全模式。不過,可以通過執(zhí)行以下命令來強(qiáng)制退出安全模式:#hdfsdfsadmin-safemodeleave安全模式也可以手動(dòng)進(jìn)入,即執(zhí)行以下命令:#hdfsdfsadmin-safemodeenter此外,執(zhí)行以下命令可以查看安全模式的狀態(tài):#hdfsdfsadmin-safemodegetHDFS的運(yùn)行機(jī)制4.3.7垃圾回收在HDFS集群中,沒有實(shí)際利用價(jià)值的block副本可以認(rèn)為是垃圾。在集群運(yùn)行正常的情況下,如果一個(gè)文件被刪除,那么與該文件相關(guān)的數(shù)據(jù)塊自然也就成了垃圾。當(dāng)用戶或應(yīng)用程序刪除某個(gè)文件時(shí),文件并不會(huì)立即從HDFS中刪除,而是被移到了一個(gè)類似回收站的地方。當(dāng)文件的刪除時(shí)間超過一定期限,NameNode就會(huì)自動(dòng)將該文件從命名空間中刪除,這會(huì)使得該文件相關(guān)的數(shù)據(jù)塊被釋放。HDFS的運(yùn)行機(jī)制當(dāng)利用balancer通過復(fù)制操作重新調(diào)整數(shù)據(jù)塊分布后,被調(diào)整的原始數(shù)據(jù)塊也會(huì)成為垃圾,這種垃圾會(huì)被放進(jìn)最近無效集(recentinvalidatesets)。在集群異常的情況下,如DataNode節(jié)點(diǎn)宕機(jī)一段時(shí)間后重啟,由于NameNode會(huì)重新進(jìn)行副本復(fù)制,這將導(dǎo)致在DataNode重啟后副本數(shù)量高于指定值,那么該DataNode上的block就會(huì)因副本過期而失去價(jià)值,沒有價(jià)值的數(shù)據(jù)等同于垃圾,這種垃圾會(huì)在DataNode向NameNode發(fā)送“心跳”時(shí)被處理。04HDFS的工作流程HDFS的工作流程在Hadoop集群中,客戶端與NameNode節(jié)點(diǎn)之間的通信、NameNode與DataNode節(jié)點(diǎn)之間的通信、DataNode節(jié)點(diǎn)彼此之間的通信,都是基于RPC(遠(yuǎn)程過程調(diào)用)機(jī)制的。RPC是一個(gè)節(jié)點(diǎn)通過網(wǎng)絡(luò)調(diào)用另一個(gè)節(jié)點(diǎn)的子程序或服務(wù)時(shí)應(yīng)遵守的協(xié)議標(biāo)準(zhǔn)。使用它時(shí),無需了解底層網(wǎng)絡(luò)協(xié)議(如TCP、UDP等)。通過客戶端、NameNode和DataNode的交互,可以實(shí)現(xiàn)HDFS文件的創(chuàng)建、復(fù)制、刪除等操作。HDFS的工作流程可以分為啟動(dòng)流程、讀流程、寫流程和刪除流程。HDFS的工作流程4.4.1啟動(dòng)流程在HDFS的啟動(dòng)過程中,需要啟動(dòng)NameNode和DataNode。NameNode啟動(dòng)時(shí),會(huì)先進(jìn)入安全模式。在安全模式下,NameNode需要處理兩件事:(1)等待每個(gè)DataNode的“心跳”以獲取所有block狀態(tài)報(bào)告,并通過“心跳”來標(biāo)記DataNode的存活狀態(tài)。然后,NameNode將接收到的各DataNode發(fā)送的block狀態(tài)報(bào)告與其元數(shù)據(jù)對(duì)比,以判斷各DataNode的數(shù)據(jù)塊是否正常。HDFS的工作流程(2)在內(nèi)存中加載fsimage,然后通過將fsimage和edits合并生成一個(gè)新的fsimage,同時(shí)創(chuàng)建一個(gè)新的edits;合并完成后刪除舊的fsimage和edits,并將新的fsimage和edits重命名。NameNode的啟動(dòng)流程DataNode啟動(dòng)時(shí),會(huì)開啟一個(gè)DataBlockScanner進(jìn)程來掃描block,并且由該進(jìn)程定期向各個(gè)NameNode發(fā)送“心跳”。HDFS的工作流程4.4.2讀流程客戶端讀取HDFS文件時(shí),首先會(huì)訪問NameNode以確認(rèn)是否可以讀取該文件,待確認(rèn)成功后,客戶端獲得該文件的block及DataNode信息,然后執(zhí)行HDFS的讀操作來獲取數(shù)據(jù)。在讀取數(shù)據(jù)結(jié)束時(shí),需關(guān)閉文件輸入流。HDFS數(shù)據(jù)的讀流程HDFS的工作流程(1)客戶端調(diào)用DistributedFileSystem對(duì)象的open()方法。此后,DistributedFileSystem將創(chuàng)建一個(gè)FSDataInputStream對(duì)象,并用HDFS的輸入流對(duì)象DFSInputStream來實(shí)例化FSDataInputStream。此外,F(xiàn)SDataInputStream對(duì)象負(fù)責(zé)存儲(chǔ)塊信息和DataNode信息,以及后續(xù)的數(shù)據(jù)讀取工作。(2)DistributedFileSystem向NameNode發(fā)送RPC請(qǐng)求,NameNode會(huì)檢查讀取文件是否存在,以及當(dāng)前客戶端是否具有讀取該文件的權(quán)限。如果都沒有問題,NameNode會(huì)視情況返回文件的部分或者全部block列表,而對(duì)于每個(gè)block,NameNode同樣會(huì)返回該block副本的所有DataNode地址。與此同時(shí),返回信息會(huì)根據(jù)與客戶端的遠(yuǎn)近(非物理上的距離,而是延遲和負(fù)載大小)對(duì)DataNode節(jié)點(diǎn)進(jìn)行排序。HDFS的工作流程(3)客戶端調(diào)用DFSInputStream的read()方法,DFSInputStream會(huì)在之前的排序結(jié)果中選擇一個(gè)最優(yōu)的DataNode節(jié)點(diǎn)建立數(shù)據(jù)連接,并開始讀取數(shù)據(jù)信息。(4)數(shù)據(jù)信息返回給客戶端。當(dāng)數(shù)據(jù)信息讀取完畢后,DFSInputStream關(guān)閉與該DataNode的連接。(5)DFSInputStream連接下一個(gè)數(shù)據(jù)塊的最優(yōu)DataNode節(jié)點(diǎn),讀取數(shù)據(jù)并返回給客戶端。當(dāng)讀完一批返回信息的block列表后,如果文件讀取還沒有結(jié)束,客戶端會(huì)繼續(xù)向NameNode請(qǐng)求獲取下一批的block列表,直到所有數(shù)據(jù)都讀取完畢。(6)當(dāng)所有數(shù)據(jù)都讀取完畢后,客戶端會(huì)調(diào)用DFSInputStream的close()方法關(guān)閉文件輸入流。HDFS的工作流程4.4.3寫流程客戶端將數(shù)據(jù)寫入到HDFS文件時(shí),首先需要向NameNode確認(rèn)寫數(shù)據(jù)的操作權(quán)限及文件是否存在(若存在,是否覆蓋),待確認(rèn)成功后,客戶端在NameNode上創(chuàng)建寫入文件的元數(shù)據(jù)信息,并返回可存儲(chǔ)數(shù)據(jù)的block及DataNode信息,然后根據(jù)返回信息執(zhí)行副本復(fù)制過程。在寫入數(shù)據(jù)結(jié)束時(shí),需關(guān)閉文件輸出流。HDFS數(shù)據(jù)的寫流程HDFS的工作流程(1)客戶端調(diào)用DistributedFileSystem對(duì)象的create()方法。此后,DistributedFileSystem將創(chuàng)建一個(gè)FSDataOutputStream對(duì)象,并用HDFS的輸出流對(duì)象DFSOutputStream來實(shí)例化FSDataOutputStream。(2)DistributedFileSystem向NameNode發(fā)送RPC請(qǐng)求,NameNode會(huì)根據(jù)要?jiǎng)?chuàng)建的文件是否已經(jīng)存在和客戶端是否有權(quán)限進(jìn)行創(chuàng)建等執(zhí)行檢查。如果沒有問題,NameNode會(huì)為文件創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶端拋出異常。(3)客戶端調(diào)用DFSOutputStream的write()方法來寫入數(shù)據(jù),DFSOutputStream將收到的數(shù)據(jù)分成一個(gè)個(gè)block大小的數(shù)據(jù)包,并放到一個(gè)數(shù)據(jù)隊(duì)列(dataqueue)中。DataStreamer可以從NameNode上獲取存儲(chǔ)數(shù)據(jù)的block信息及DataNode地址,然后DataStreamer將數(shù)據(jù)從隊(duì)列中取出并開始寫入DataNode。HDFS的工作流程(4)對(duì)于每個(gè)block,NameNode會(huì)分配與副本系數(shù)相等數(shù)量的DataNode來存儲(chǔ)block副本。DFSOutputStream將數(shù)據(jù)寫入第一個(gè)DataNode,然后該DataNode根據(jù)副本放置與機(jī)架感知策略將數(shù)據(jù)塊復(fù)制并傳輸給其他DataNode,直到寫入所有block副本。(5)每個(gè)DataNode完成數(shù)據(jù)存儲(chǔ)后,會(huì)向客戶端發(fā)送“確認(rèn)包”(ackpacket)??蛻舳私邮茼憫?yīng)后,會(huì)將對(duì)應(yīng)的數(shù)據(jù)包從數(shù)據(jù)隊(duì)列中刪除。不斷執(zhí)行步驟(3)~步驟(5),直到所有數(shù)據(jù)寫完。(6)當(dāng)所有數(shù)據(jù)都寫入完畢后,客戶端會(huì)調(diào)用DFSOutputStream的close()方法關(guān)閉文件輸出流。(7)客戶端調(diào)用complete()方法通知NameNode文件寫入完成。HDFS的工作流程4.4.4刪除流程1.使用HDFS命令刪除文件與Linux系統(tǒng)的回收站設(shè)計(jì)類似,HDFS也為每個(gè)用戶創(chuàng)建了一個(gè)回收站目錄。例如,root用戶的回收站目錄為hdfs://hadoop0:9000/user/root/.Trash。當(dāng)用戶使用HDFS命令執(zhí)行刪除操作后,系統(tǒng)會(huì)將需要?jiǎng)h除的文件移動(dòng)到回收站的“/Current”文件夾(系統(tǒng)自動(dòng)創(chuàng)建)下。例如,當(dāng)root用戶使用HDFS命令刪除“/jqe/1.txt”文件時(shí),文件會(huì)被移動(dòng)到回收站中,具體位置為hdfs://hadoop0:9000/user/root/.Trash/Current/jqe/1.txt。與刪除普通文件一樣,用戶也可以手動(dòng)刪除回收站中的文件。不過,HDFS會(huì)自動(dòng)檢測(cè)這個(gè)文件,如果是回收站中的文件,那么該文件就不會(huì)被移動(dòng)到用戶的回收站中,而是將其徹底刪除?;厥照局斜4娴奈募怯袝r(shí)間限制的,如果用戶在規(guī)定的時(shí)間周期內(nèi)沒有將文件從回收站中恢復(fù)出來,那么HDFS就會(huì)將該文件徹底刪除(NameNode的后臺(tái)線程emptier負(fù)責(zé)管理和監(jiān)控回收站中的所有文件及目錄)。之后,用戶就再也無法找回那個(gè)刪除的文件了。HDFS的工作流程HDFS的工作流程2.使用JavaAPI刪除文件當(dāng)用戶使用JavaAPI刪除HDFS文件時(shí),在執(zhí)行完delete()方法一段時(shí)間后,要?jiǎng)h除文件的數(shù)據(jù)塊才能被真正地刪除。具體文件刪除過程如下:(1)客戶端向NameNode發(fā)送刪除操作的RPC請(qǐng)求。(2)NameNode收到客戶端的刪除請(qǐng)求后,會(huì)檢查要?jiǎng)h除的文件是否存在,以及該客戶端是否具有刪除文件的權(quán)限。待確認(rèn)后,再將刪除操作更新到edits和fsimage文件。(3)NameNode更新結(jié)束后,會(huì)返回給客戶端一個(gè)確認(rèn)信號(hào),表示刪除成功。HDFS的工作流程當(dāng)NameNode執(zhí)行delete()方法時(shí),它只記錄操作和標(biāo)記要?jiǎng)h除文件的block,而不會(huì)主動(dòng)通知block副本所在的DataNode去刪除相應(yīng)的block。當(dāng)保存這些block副本的DataNode向NameNode發(fā)送“心跳”時(shí),NameNode校驗(yàn)到DataNode的數(shù)據(jù)不一致,就會(huì)給DataNode下達(dá)指令,讓其刪除那些無效的block副本。05HDFS的基本操作HDFS的基本操作用戶可以通過命令行接口(類似傳統(tǒng)的Shell命令)操作HDFS的文件和目錄,也可以通過JavaAPI訪問并操作HDFS。HDFS的基本操作4.5.1HDFS命令行操作Hadoop分布式文件系統(tǒng)(HDFS)中的基本操作與其他文件系統(tǒng)類似,包括創(chuàng)建文件、移動(dòng)文件、查看文件目錄、讀取文件等。下面介紹一組常用的HDFS命令行操作。(1)查看HDFS支持的所有命令及解析:#hdfsdfs-help(2)查看HDFS文件系統(tǒng)根目錄下的目錄和文件:#hdfsdfs-ls/HDFS的基本操作(3)在HDFS文件系統(tǒng)根目錄下創(chuàng)建文件夾:#hdfsdfs-mkdir/mywork(4)將本地文件上傳到HDFS文件系統(tǒng)中:#hdfsdfs-puta.txt/mywork(5)將HDFS文件系統(tǒng)中的文件下載到本地(即虛擬機(jī)系統(tǒng)中):#hdfsdfs-get/mywork/a.txt/root/DownloadsHDFS的基本操作(6)將HDFS文件系統(tǒng)中的文件復(fù)制到其他目錄(必須存在):#hdfsdfs-cp/mywork/a.txt/mywork/t1/如果復(fù)制HDFS中的文件到另一個(gè)文件,則相當(dāng)于將文件復(fù)制一份并重命名(源文件仍然存在),如:#hdfsdfs-cp/mywork/a.txt/mywork/b.txt(7)將HDFS文件系統(tǒng)中的文件移動(dòng)到其他目錄(必須存在):#hdfsdfs-mv/mywork/a.txt/input/如果移動(dòng)HDFS中的文件到另一個(gè)文件,則相當(dāng)于對(duì)文件進(jìn)行重命名并保存(源文件已不存在),如:#hdfsdfs-mv/mywork/b.txt/mywork/c.txtHDFS的基本操作(8)查看HDFS文件系統(tǒng)中某個(gè)文件的內(nèi)容:#hdfsdfs-cat/input/word.txt(9)刪除HDFS文件系統(tǒng)中的文件或文件夾:#hdfsdfs-rm/input/a.txt#hdfsdfs-rm-r/mywork/t1(10)查看HDFS文件系統(tǒng)的可用空間信息:#hdfsdfs-df/“-r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論