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

下載本文檔

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

文檔簡(jiǎn)介

1、第第10章章 分布式文件系統(tǒng)分布式文件系統(tǒng)HDFS云計(jì)算與大規(guī)模數(shù)據(jù)處理云計(jì)算與大規(guī)模數(shù)據(jù)處理提綱10.1 分布式文件系統(tǒng)分布式文件系統(tǒng)10.2 HDFS簡(jiǎn)介簡(jiǎn)介10.3 HDFS相關(guān)概念相關(guān)概念10.4 HDFS體系結(jié)構(gòu)體系結(jié)構(gòu)10.5 HDFS存儲(chǔ)原理存儲(chǔ)原理10.6 HDFS數(shù)據(jù)讀寫過程數(shù)據(jù)讀寫過程10.7 HDFS編程實(shí)踐編程實(shí)踐10.1分布式文件系統(tǒng) 10.1.1計(jì)算機(jī)集群結(jié)構(gòu)計(jì)算機(jī)集群結(jié)構(gòu) 10.1.2分布式文件系統(tǒng)的結(jié)構(gòu)分布式文件系統(tǒng)的結(jié)構(gòu)10.1.1計(jì)算機(jī)集群結(jié)構(gòu)分布式文件系統(tǒng)把文件分布存儲(chǔ)到多個(gè)計(jì)算機(jī)節(jié)點(diǎn)上,成千上萬的計(jì)算機(jī)節(jié)點(diǎn)構(gòu)成計(jì)算機(jī)集群。與之前使用多個(gè)處理器和專用高級(jí)硬

2、件的并行化處理裝置不同的是,目前的分布式文件系統(tǒng)所采用的計(jì)算機(jī)集群,都是由普通硬件構(gòu)成的,這就大大降低了硬件上的開銷。圖10-1 計(jì)算機(jī)集群的基本架構(gòu) 10.1.2分布式文件系統(tǒng)的結(jié)構(gòu)分布式文件系統(tǒng)在物理結(jié)構(gòu)上是由計(jì)算機(jī)集群中的多個(gè)節(jié)點(diǎn)構(gòu)成的,這些節(jié)點(diǎn)分為兩類,一類叫“主節(jié)點(diǎn)”(Master Node)或者也被稱為“名稱結(jié)點(diǎn)”(NameNode),另一類叫“從節(jié)點(diǎn)”(Slave Node)或者也被稱為“數(shù)據(jù)節(jié)點(diǎn)”(DataNode)圖10-2 大規(guī)模文件系統(tǒng)的整體結(jié)構(gòu)10.2 HDFS簡(jiǎn)介簡(jiǎn)介總體而言,HDFS要實(shí)現(xiàn)以下目標(biāo):兼容廉價(jià)的硬件設(shè)備兼容廉價(jià)的硬件設(shè)備流數(shù)據(jù)讀寫流數(shù)據(jù)讀寫大數(shù)據(jù)集大數(shù)

3、據(jù)集簡(jiǎn)單的文件模型簡(jiǎn)單的文件模型強(qiáng)大的跨平臺(tái)兼容性強(qiáng)大的跨平臺(tái)兼容性HDFS特殊的設(shè)計(jì),在實(shí)現(xiàn)上述優(yōu)良特性的同時(shí),也使得自身具有一些應(yīng)用局限性,主要包括以下幾個(gè)方面:不適合低延遲數(shù)據(jù)訪問不適合低延遲數(shù)據(jù)訪問無法高效存儲(chǔ)大量小文件無法高效存儲(chǔ)大量小文件不支持多用戶寫入及任意修改文件不支持多用戶寫入及任意修改文件10.3.1塊塊HDFS默認(rèn)一個(gè)塊64MB,一個(gè)文件被分成多個(gè)塊,以塊作為存儲(chǔ)單位塊的大小遠(yuǎn)遠(yuǎn)大于普通文件系統(tǒng),可以最小化尋址開銷HDFS采用抽象的塊概念可以帶來以下幾個(gè)明顯的好處: 支持大規(guī)模文件存儲(chǔ)支持大規(guī)模文件存儲(chǔ):文件以塊為單位進(jìn)行存儲(chǔ),一個(gè)大規(guī)模文件可以被分拆成若干個(gè)文件塊,不同

4、的文件塊可以被分發(fā)到不同的節(jié)點(diǎn)上,因此,一個(gè)文件的大小不會(huì)受到單個(gè)節(jié)點(diǎn)的存儲(chǔ)容量的限制,可以遠(yuǎn)遠(yuǎn)大于網(wǎng)絡(luò)中任意節(jié)點(diǎn)的存儲(chǔ)容量 簡(jiǎn)化系統(tǒng)設(shè)計(jì)簡(jiǎn)化系統(tǒng)設(shè)計(jì):首先,大大簡(jiǎn)化了存儲(chǔ)管理,因?yàn)槲募K大小是固定的,這樣就可以很容易計(jì)算出一個(gè)節(jié)點(diǎn)可以存儲(chǔ)多少文件塊;其次,方便了元數(shù)據(jù)的管理,元數(shù)據(jù)不需要和文件塊一起存儲(chǔ),可以由其他系統(tǒng)負(fù)責(zé)管理元數(shù)據(jù) 適合數(shù)據(jù)備份適合數(shù)據(jù)備份:每個(gè)文件塊都可以冗余存儲(chǔ)到多個(gè)節(jié)點(diǎn)上,大大提高了系統(tǒng)的容錯(cuò)性和可用性10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)在HDFS中,名稱節(jié)點(diǎn)(NameNode)負(fù)責(zé)管理分布式文件系統(tǒng)的命名空

5、間(Namespace),保存了兩個(gè)核心的數(shù)據(jù)結(jié)構(gòu),即FsImage和EditLogFsImage用于維護(hù)文件系統(tǒng)樹以及文件樹中所有的文件和文件夾的元數(shù)據(jù)操作日志文件EditLog中記錄了所有針對(duì)文件的創(chuàng)建、刪除、重命名等操作名稱節(jié)點(diǎn)記錄了每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息圖10-3 名稱節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu) 名稱節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)名稱節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)FsImage文件包含文件系統(tǒng)中所有目錄和文件inode的序列化形式。每個(gè)inode是一個(gè)文件或目錄的元數(shù)據(jù)的內(nèi)部表示,并包含此類信息:文件的復(fù)制等級(jí)、修改和訪問時(shí)間、訪問權(quán)限、塊大小以及組成文件的塊。對(duì)

6、于目錄,則存儲(chǔ)修改時(shí)間、權(quán)限和配額元數(shù)據(jù)FsImage文件沒有記錄塊存儲(chǔ)在哪個(gè)數(shù)據(jù)節(jié)點(diǎn)。而是由名稱節(jié)點(diǎn)把這些映射保留在內(nèi)存中,當(dāng)數(shù)據(jù)節(jié)點(diǎn)加入HDFS集群時(shí),數(shù)據(jù)節(jié)點(diǎn)會(huì)把自己所包含的塊列表告知給名稱節(jié)點(diǎn),此后會(huì)定期執(zhí)行這種告知操作,以確保名稱節(jié)點(diǎn)的塊映射是最新的。FsImage文件文件10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)在名稱節(jié)點(diǎn)啟動(dòng)的時(shí)候,它會(huì)將FsImage文件中的內(nèi)容加載到內(nèi)存中,之后再執(zhí)行EditLog文件中的各項(xiàng)操作,使得內(nèi)存中的元數(shù)據(jù)和實(shí)際的同步,存在內(nèi)存中的元數(shù)據(jù)支持客戶端的讀操作。一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映射,則創(chuàng)建一個(gè)新的FsImage文件和一個(gè)空的Ed

7、itLog文件名稱節(jié)點(diǎn)起來之后,HDFS中的更新操作會(huì)重新寫到EditLog文件中,因?yàn)镕sImage文件一般都很大(GB級(jí)別的很常見),如果所有的更新操作都往FsImage文件中添加,這樣會(huì)導(dǎo)致系統(tǒng)運(yùn)行的十分緩慢,但是,如果往EditLog文件里面寫就不會(huì)這樣,因?yàn)镋ditLog 要小很多。每次執(zhí)行寫操作之后,且在向客戶端發(fā)送成功代碼之前,edits文件都需要同步更新名稱節(jié)點(diǎn)的啟動(dòng)名稱節(jié)點(diǎn)的啟動(dòng)10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)在名稱節(jié)點(diǎn)運(yùn)行期間,HDFS的所有更新操作都是直接寫到EditLog中,久而久之, EditLog文件將會(huì)變得很大雖然這對(duì)名稱節(jié)點(diǎn)運(yùn)行時(shí)候是沒有什么明顯

8、影響的,但是,當(dāng)名稱節(jié)點(diǎn)重啟的時(shí)候,名稱節(jié)點(diǎn)需要先將FsImage里面的所有內(nèi)容映像到內(nèi)存中,然后再一條一條地執(zhí)行EditLog中的記錄,當(dāng)EditLog文件非常大的時(shí)候,會(huì)導(dǎo)致名稱節(jié)點(diǎn)啟動(dòng)操作非常慢,而在這段時(shí)間內(nèi)HDFS系統(tǒng)處于安全模式,一直無法對(duì)外提供寫操作,影響了用戶的使用名稱節(jié)點(diǎn)運(yùn)行期間名稱節(jié)點(diǎn)運(yùn)行期間EditLog不斷變大的問題不斷變大的問題如何解決?答案是:SecondaryNameNode第二名稱節(jié)點(diǎn)第二名稱節(jié)點(diǎn)第二名稱節(jié)點(diǎn)是HDFS架構(gòu)中的一個(gè)組成部分,它是用來保存名稱節(jié)點(diǎn)中對(duì)HDFS 元數(shù)據(jù)信息的備份,并減少名稱節(jié)點(diǎn)重啟的時(shí)間。SecondaryNameNode一般是單獨(dú)運(yùn)

9、行在一臺(tái)機(jī)器上。10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)SecondaryNameNode的工作情況:(1)SecondaryNameNode會(huì)定期和NameNode通信,請(qǐng)求其停止使用EditLog文件,暫時(shí)將新的寫操作寫到一個(gè)新的文件edit.new上來,這個(gè)操作是瞬間完成,上層寫日志的函數(shù)完全感覺不到差別;(2)SecondaryNameNode通過HTTP GET方式從NameNode上獲取到FsImage和EditLog文件,并下載到本地的相應(yīng)目錄下;(3)SecondaryNameNode將下載下來的FsImage載入到內(nèi)存,然后一條一條地執(zhí)行EditLog文件中的各項(xiàng)更新

10、操作,使得內(nèi)存中的FsImage保持最新;這個(gè)過程就是EditLog和FsImage文件合并;(4)SecondaryNameNode執(zhí)行完(3)操作之后,會(huì)通過post方式將新的FsImage文件發(fā)送到NameNode節(jié)點(diǎn)上(5)NameNode將從SecondaryNameNode接收到的新的FsImage替換舊的FsImage文件,同時(shí)將edit.new替換EditLog文件,通過這個(gè)過程EditLog就變小了10.3.2名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)節(jié)點(diǎn)是分布式文件系統(tǒng)HDFS的工作節(jié)點(diǎn),負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取,會(huì)根據(jù)客戶端或者是名稱節(jié)點(diǎn)的調(diào)度來進(jìn)行數(shù)據(jù)的存儲(chǔ)和檢索,并且向名稱

11、節(jié)點(diǎn)定期發(fā)送自己所存儲(chǔ)的塊的列表每個(gè)數(shù)據(jù)節(jié)點(diǎn)中的數(shù)據(jù)會(huì)被保存在各自節(jié)點(diǎn)的本地Linux文件系統(tǒng)中數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)節(jié)點(diǎn)(DataNode)10.4 HDFS體系結(jié)構(gòu) 10.4.1HDFS體系結(jié)構(gòu)概述 10.4.2HDFS命名空間管理 10.4.3通信協(xié)議 10.4.4客戶端 10.4.5HDFS體系結(jié)構(gòu)的局限性10.4.1HDFS體系結(jié)構(gòu)概述體系結(jié)構(gòu)概述 HDFS采用了主從(Master/Slave)結(jié)構(gòu)模型,一個(gè)HDFS集群包括一個(gè)名稱節(jié)點(diǎn)(NameNode)和若干個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode)(如圖3-4所示)。名稱節(jié)點(diǎn)作為中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的命名空間及客戶端對(duì)文件的訪問。集群中的數(shù)據(jù)

12、節(jié)點(diǎn)一般是一個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)數(shù)據(jù)節(jié)點(diǎn)進(jìn)程,負(fù)責(zé)處理文件系統(tǒng)客戶端的讀/寫請(qǐng)求,在名稱節(jié)點(diǎn)的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制等操作。每個(gè)數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)實(shí)際上是保存在本地Linux文件系統(tǒng)中。圖10-4 HDFS體系結(jié)構(gòu) 10.4.2HDFS命名空間管理命名空間管理 HDFS的命名空間包含目錄、文件和塊 在HDFS1.0體系結(jié)構(gòu)中,在整個(gè)HDFS集群中只有一個(gè)命名空間,并且只有唯一一個(gè)名稱節(jié)點(diǎn),該節(jié)點(diǎn)負(fù)責(zé)對(duì)這個(gè)命名空間進(jìn)行管理 HDFS使用的是傳統(tǒng)的分級(jí)文件體系,因此,用戶可以像使用普通文件系統(tǒng)一樣,創(chuàng)建、刪除目錄和文件,在目錄間轉(zhuǎn)移文件,重命名文件等10.4.3通信協(xié)議通信協(xié)議 HDFS是一

13、個(gè)部署在集群上的分布式文件系統(tǒng),因此,很多數(shù)據(jù)需要通過網(wǎng)絡(luò)進(jìn)行傳輸 所有的HDFS通信協(xié)議都是構(gòu)建在TCP/IP協(xié)議基礎(chǔ)之上的 客戶端通過一個(gè)可配置的端口向名稱節(jié)點(diǎn)主動(dòng)發(fā)起TCP連接,并使用客戶端協(xié)議與名稱節(jié)點(diǎn)進(jìn)行交互 名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)之間則使用數(shù)據(jù)節(jié)點(diǎn)協(xié)議進(jìn)行交互 客戶端與數(shù)據(jù)節(jié)點(diǎn)的交互是通過RPC(Remote Procedure Call)來實(shí)現(xiàn)的。在設(shè)計(jì)上,名稱節(jié)點(diǎn)不會(huì)主動(dòng)發(fā)起RPC,而是響應(yīng)來自客戶端和數(shù)據(jù)節(jié)點(diǎn)的RPC請(qǐng)求10.4.4客戶端客戶端 客戶端是用戶操作HDFS最常用的方式,HDFS在部署時(shí)都提供了客戶端 HDFS客戶端是一個(gè)庫,暴露了HDFS文件系統(tǒng)接口,這些接口隱藏了

14、HDFS實(shí)現(xiàn)中的大部分復(fù)雜性 嚴(yán)格來說,客戶端并不算是HDFS的一部分 客戶端可以支持打開、讀取、寫入等常見的操作,并且提供了類似Shell的命令行方式來訪問HDFS中的數(shù)據(jù) 此外,HDFS也提供了Java API,作為應(yīng)用程序訪問文件系統(tǒng)的客戶端編程接口10.4.5HDFS體系結(jié)構(gòu)的局限性體系結(jié)構(gòu)的局限性HDFS只設(shè)置唯一一個(gè)名稱節(jié)點(diǎn),這樣做雖然大大簡(jiǎn)化了系統(tǒng)設(shè)計(jì),但也帶來了一些明顯的局限性,具體如下: (1)命名空間的限制命名空間的限制:名稱節(jié)點(diǎn)是保存在內(nèi)存中的,因此,名稱節(jié)點(diǎn)能夠容納的對(duì)象(文件、塊)的個(gè)數(shù)會(huì)受到內(nèi)存空間大小的限制。 (2)性能的瓶頸性能的瓶頸:整個(gè)分布式文件系統(tǒng)的吞吐量

15、,受限于單個(gè)名稱節(jié)點(diǎn)的吞吐量。 (3)隔離問題隔離問題:由于集群中只有一個(gè)名稱節(jié)點(diǎn),只有一個(gè)命名空間,因此,無法對(duì)不同應(yīng)用程序進(jìn)行隔離。 (4)集群的可用性集群的可用性:一旦這個(gè)唯一的名稱節(jié)點(diǎn)發(fā)生故障,會(huì)導(dǎo)致整個(gè)集群變得不可用。10.5 HDFS存儲(chǔ)原理 10.5.1冗余數(shù)據(jù)保存冗余數(shù)據(jù)保存 10.5.2數(shù)據(jù)存取策略數(shù)據(jù)存取策略 10.5.3數(shù)據(jù)錯(cuò)誤與恢復(fù)數(shù)據(jù)錯(cuò)誤與恢復(fù)10.5.1冗余數(shù)據(jù)保存冗余數(shù)據(jù)保存 作為一個(gè)分布式文件系統(tǒng),為了保證系統(tǒng)的容錯(cuò)性和可用性,HDFS采用了多副本方式對(duì)數(shù)據(jù)進(jìn)行冗余存儲(chǔ),通常一個(gè)數(shù)據(jù)塊的多個(gè)副本會(huì)被分布到不同的數(shù)據(jù)節(jié)點(diǎn)上,如圖3-5所示,數(shù)據(jù)塊1被分別存放到數(shù)據(jù)

16、節(jié)點(diǎn)A和C上,數(shù)據(jù)塊2被存放在數(shù)據(jù)節(jié)點(diǎn)A和B上。這種多副本方式具有以下幾個(gè)優(yōu)點(diǎn): (1)加快數(shù)據(jù)傳輸速度加快數(shù)據(jù)傳輸速度 (2)容易檢查數(shù)據(jù)錯(cuò)誤容易檢查數(shù)據(jù)錯(cuò)誤 (3)保證數(shù)據(jù)可靠性保證數(shù)據(jù)可靠性圖10-5 HDFS數(shù)據(jù)塊多副本存儲(chǔ) 10.5.2數(shù)據(jù)存取策略數(shù)據(jù)存取策略1.數(shù)據(jù)存放數(shù)據(jù)存放Block的副本放置策略第一個(gè)副本:放置在上傳文件的數(shù)據(jù)節(jié)點(diǎn);如果是集群外提交,則隨機(jī)挑選一臺(tái)磁盤不太滿、CPU不太忙的節(jié)點(diǎn)第二個(gè)副本:放置在與第一個(gè)副本不同的機(jī)架的節(jié)點(diǎn)上第三個(gè)副本:與第一個(gè)副本相同機(jī)架的其他節(jié)點(diǎn)上更多副本:隨機(jī)節(jié)點(diǎn)3.5.2數(shù)據(jù)存取策略數(shù)據(jù)存取策略2. 數(shù)據(jù)讀取數(shù)據(jù)讀取HDFS提供了一個(gè)A

17、PI可以確定一個(gè)數(shù)據(jù)節(jié)點(diǎn)所屬的機(jī)架ID,客戶端也可以調(diào)用API獲取自己所屬的機(jī)架ID當(dāng)客戶端讀取數(shù)據(jù)時(shí),從名稱節(jié)點(diǎn)獲得數(shù)據(jù)塊不同副本的存放位置列表,列表中包含了副本所在的數(shù)據(jù)節(jié)點(diǎn),可以調(diào)用API來確定客戶端和這些數(shù)據(jù)節(jié)點(diǎn)所屬的機(jī)架ID,當(dāng)發(fā)現(xiàn)某個(gè)數(shù)據(jù)塊副本對(duì)應(yīng)的機(jī)架ID和客戶端對(duì)應(yīng)的機(jī)架ID相同時(shí),就優(yōu)先選擇該副本讀取數(shù)據(jù),如果沒有發(fā)現(xiàn),就隨機(jī)選擇一個(gè)副本讀取數(shù)據(jù)10.5.3數(shù)據(jù)錯(cuò)誤與恢復(fù)數(shù)據(jù)錯(cuò)誤與恢復(fù) HDFS具有較高的容錯(cuò)性,可以兼容廉價(jià)的硬件,它把硬件出錯(cuò)看作一種常態(tài),而不是異常,并設(shè)計(jì)了相應(yīng)的機(jī)制檢測(cè)數(shù)據(jù)錯(cuò)誤和進(jìn)行自動(dòng)恢復(fù),主要包括以下幾種情形:名稱節(jié)點(diǎn)出錯(cuò)、數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)和數(shù)據(jù)出錯(cuò)。1

18、. 名稱節(jié)點(diǎn)出錯(cuò)名稱節(jié)點(diǎn)出錯(cuò) 名稱節(jié)點(diǎn)保存了所有的元數(shù)據(jù)信息,其中,最核心的兩大數(shù)據(jù)結(jié)構(gòu)是FsImage和Editlog,如果這兩個(gè)文件發(fā)生損壞,那么整個(gè)HDFS實(shí)例將失效。因此,HDFS設(shè)置了備份機(jī)制,把這些核心文件同步復(fù)制到備份服務(wù)器SecondaryNameNode上。當(dāng)名稱節(jié)點(diǎn)出錯(cuò)時(shí),就可以根據(jù)備份服務(wù)器SecondaryNameNode中的FsImage和Editlog數(shù)據(jù)進(jìn)行恢復(fù)。3.5.3數(shù)據(jù)錯(cuò)誤與恢復(fù)數(shù)據(jù)錯(cuò)誤與恢復(fù)2. 數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)每個(gè)數(shù)據(jù)節(jié)點(diǎn)會(huì)定期向名稱節(jié)點(diǎn)發(fā)送“心跳”信息,向名稱節(jié)點(diǎn)報(bào)告自己的狀態(tài)當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生故障,或者網(wǎng)絡(luò)發(fā)生斷網(wǎng)時(shí),名稱節(jié)點(diǎn)就無法收到來自一些

19、數(shù)據(jù)節(jié)點(diǎn)的心跳信息,這時(shí),這些數(shù)據(jù)節(jié)點(diǎn)就會(huì)被標(biāo)記為“宕機(jī)”,節(jié)點(diǎn)上面的所有數(shù)據(jù)都會(huì)被標(biāo)記為“不可讀”,名稱節(jié)點(diǎn)不會(huì)再給它們發(fā)送任何I/O請(qǐng)求這時(shí),有可能出現(xiàn)一種情形,即由于一些數(shù)據(jù)節(jié)點(diǎn)的不可用,會(huì)導(dǎo)致一些數(shù)據(jù)塊的副本數(shù)量小于冗余因子名稱節(jié)點(diǎn)會(huì)定期檢查這種情況,一旦發(fā)現(xiàn)某個(gè)數(shù)據(jù)塊的副本數(shù)量小于冗余因子,就會(huì)啟動(dòng)數(shù)據(jù)冗余復(fù)制,為它生成新的副本HDFS和其它分布式文件系統(tǒng)的最大區(qū)別就是可以調(diào)整冗余數(shù)據(jù)的位置3.5.3數(shù)據(jù)錯(cuò)誤與恢復(fù)數(shù)據(jù)錯(cuò)誤與恢復(fù)3. 數(shù)據(jù)出錯(cuò)數(shù)據(jù)出錯(cuò)網(wǎng)絡(luò)傳輸和磁盤錯(cuò)誤等因素,都會(huì)造成數(shù)據(jù)錯(cuò)誤客戶端在讀取到數(shù)據(jù)后,會(huì)采用md5和sha1對(duì)數(shù)據(jù)塊進(jìn)行校驗(yàn),以確定讀取到正確的數(shù)據(jù)在文件被創(chuàng)

20、建時(shí),客戶端就會(huì)對(duì)每一個(gè)文件塊進(jìn)行信息摘錄,并把這些信息寫入到同一個(gè)路徑的隱藏文件里面當(dāng)客戶端讀取文件的時(shí)候,會(huì)先讀取該信息文件,然后,利用該信息文件對(duì)每個(gè)讀取的數(shù)據(jù)塊進(jìn)行校驗(yàn),如果校驗(yàn)出錯(cuò),客戶端就會(huì)請(qǐng)求到另外一個(gè)數(shù)據(jù)節(jié)點(diǎn)讀取該文件塊,并且向名稱節(jié)點(diǎn)報(bào)告這個(gè)文件塊有錯(cuò)誤,名稱節(jié)點(diǎn)會(huì)定期檢查并且重新復(fù)制這個(gè)塊10.6 HDFS數(shù)據(jù)讀寫過程 10.6.1讀數(shù)據(jù)的過程讀數(shù)據(jù)的過程 10.6.2寫數(shù)據(jù)的過程寫數(shù)據(jù)的過程10.6 HDFS數(shù)據(jù)讀寫過程讀取文件importjava.io.BufferedReader;importjava.io.InputStreamReader;importorg.ap

21、ache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.fs.FSDataInputStream;publicclassChapter3publicstaticvoidmain(Stringargs)tryConfigurationconf=newConfiguration();FileSystemfs=FileSystem.get(conf);Pathfilename=newPath(“hdfs:/l

22、ocalhost:9000/user/hadoop/test.txt);FSDataInputStreamis=fs.open(filename);BufferedReaderd=newBufferedReader(newInputStreamReader(is);Stringcontent=d.readLine();/讀取文件一行System.out.println(content);d.close();/關(guān)閉文件fs.close();/關(guān)閉hdfscatch(Exceptione)e.printStackTrace();10.6 HDFS數(shù)據(jù)讀寫過程寫入文件import org.apach

23、e.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.Path; public class Chapter3 public static void main(String args) try Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); byte buf

24、f = Hello world.getBytes(); / 要寫入的內(nèi)容 String filename = hdfs:/localhost:9000/user/hadoop/test.txt; /要寫入的文件名 FSDataOutputStream os = fs.create(new Path(filename); os.write(buff,0,buff.length); System.out.println(Create:+ filename); catch (Exception e) e.printStackTrace(); 10.6 HDFS數(shù)據(jù)讀寫過程FileSystem是一個(gè)通

25、用文件系統(tǒng)的抽象基類,可以被分布式文件系統(tǒng)繼承,所有可能使用Hadoop文件系統(tǒng)的代碼,都要使用這個(gè)類Hadoop為FileSystem這個(gè)抽象類提供了多種具體實(shí)現(xiàn)DistributedFileSystem就是FileSystem在HDFS文件系統(tǒng)中的具體實(shí)現(xiàn)FileSystem的open()方法返回的是一個(gè)輸入流FSDataInputStream對(duì)象,在HDFS文件系統(tǒng)中,具體的輸入流就是DFSInputStream;FileSystem中的create()方法返回的是一個(gè)輸出流FSDataOutputStream對(duì)象,在HDFS文件系統(tǒng)中,具體的輸出流就是DFSOutputStream。C

26、onfiguration conf = new Configuration();FileSystem fs = FileSystem.get(conf);FSDataInputStream in = fs.open(new Path(uri);FSDataOutputStream out = fs.create(new Path(uri);備注:創(chuàng)建一個(gè)Configuration對(duì)象時(shí),其構(gòu)造方法會(huì)默認(rèn)加載工程項(xiàng)目下兩個(gè)配置文件,分別是hdfs-site.xml以及core-site.xml,這兩個(gè)文件中會(huì)有訪問HDFS所需的參數(shù)值,主要是fs.defaultFS,指定了HDFS的地址(比如hdfs:/localhost:9000),有了這個(gè)地址客戶端就可以通過這個(gè)地址訪問HDFS了 10.6.1讀數(shù)據(jù)的過程讀數(shù)據(jù)的過程FSDataInputStream封裝了DFSInputStreamFileSystem fs = FileSystem.get(conf);FSDataInputStream in = fs.open(new Path(uri);Configuration conf = new Configuration();import org.apache.hadoop.fs.

溫馨提示

  • 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)論