Hadoop學(xué)習(xí)總結(jié)之二:HDFS讀寫過程解析_第1頁
Hadoop學(xué)習(xí)總結(jié)之二:HDFS讀寫過程解析_第2頁
Hadoop學(xué)習(xí)總結(jié)之二:HDFS讀寫過程解析_第3頁
Hadoop學(xué)習(xí)總結(jié)之二:HDFS讀寫過程解析_第4頁
Hadoop學(xué)習(xí)總結(jié)之二:HDFS讀寫過程解析_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一、文件的打開1.1、客戶端HDFS打開一個(gè)文件,需要在客戶端調(diào)用分布式文件系統(tǒng)。打開(路徑f,內(nèi)部緩沖區(qū)大小),其實(shí)現(xiàn)為:公共FSDataInputStream打開(路徑f,int bufferSize)引發(fā)io異常返回新的客戶.DFSDataInputStream(dfs.open(getPathName(f),bufferSize,verifyChecksum,statistics);其中深度優(yōu)先搜索為分布式文件系統(tǒng)的成員變量DFSClient,其打開函數(shù)被調(diào)用,其中創(chuàng)建一個(gè)DFSInputStream(src,buffersize,verifyChecksum)并返回。在DFSInpu

2、tStream的構(gòu)造函數(shù)中,openInfo函數(shù)被調(diào)用,其主要從名稱節(jié)點(diǎn)中得到要打開的文件所對(duì)應(yīng)的阻礙的信息,實(shí)現(xiàn)如下:同步的void openInfo()引發(fā)io異常LocatedBlockNewInfo=callGetBlockLocations(名稱節(jié)點(diǎn),src,0,預(yù)取大小);this.locatedBlocks=newInfothis.currentNode=null私有靜態(tài)定位塊調(diào)用GetBlockLocations(客戶端協(xié)議名稱節(jié)點(diǎn),字符串src,長開始,長長度)拋出異常返回namenode.getBlockLocations(src,開始,長度);定位塊主要包含一個(gè)鏈表的列表

3、塊,其中每個(gè)LocatedBlock包含如下信息:b區(qū):此街區(qū)的信息長偏移:此街區(qū)在文件中的偏移量數(shù)據(jù)節(jié)點(diǎn)信息loca:此街區(qū)位于哪些數(shù)據(jù)節(jié)點(diǎn)上上面namenode.getBlockLocations是一個(gè)RPC調(diào)用,最終調(diào)用名稱節(jié)點(diǎn)類的獲取塊位置函數(shù)。1.2、名稱節(jié)點(diǎn)NameNode.getBlockLocations實(shí)現(xiàn)如下:公共locatedblockgetblocklocations(字符串src,長偏移,長)拋出異常返回命名系統(tǒng)。GetBlockLocations(GetClientMachine(),src,偏移量,長度);命名系統(tǒng)是名稱節(jié)點(diǎn)一個(gè)成員變量,其類型為FSNamesys

4、tem,保存的是名稱節(jié)點(diǎn)的名稱空間樹,其中一個(gè)重要的成員變量為目錄目錄。FSDirectory和Lucene中的FSDirectory沒有任何關(guān)系,其主要包括FSImage fsImage,用于讀寫硬盤上的fsimage文件,F(xiàn)SImage類有成員變量編輯日志編輯日志,用于讀寫硬盤上的編輯文件,這兩個(gè)文件的關(guān)系在上一篇文章中已經(jīng)解釋過。FSDirectory還有一個(gè)重要的成員變量索引節(jié)點(diǎn)目錄帶配額根目錄,索引節(jié)點(diǎn)目錄帶配額的父類為索引節(jié)點(diǎn)目錄,實(shí)現(xiàn)如下:公共類索引節(jié)點(diǎn)目錄擴(kuò)展了INode 私人名單兒童;由此可見索引節(jié)點(diǎn)目錄本身是一個(gè)INode,其中包含一個(gè)鏈表的INode,此鏈表中,如果仍為文

5、件夾,則是類型索引節(jié)點(diǎn)目錄,如果是文件,則是類型索引節(jié)點(diǎn)文件,索引節(jié)點(diǎn)文件中有成員變量塊信息塊,是此文件包含的街區(qū)的信息。顯然這是一棵樹形的結(jié)構(gòu)。FSNamesystem.getBlockLocations函數(shù)如下:公共locatedblockgetblocklocations(字符串src,長偏移量,長長度,布爾doAccessTime)引發(fā)io異常final LocatedBlocks ret=GetBlockLocationSinternal(src,dir.getFileINode(src),偏移量,長度,整數(shù)。最大值,時(shí)間);返回浸水使柔軟dir.getFileINode(src)通

6、過路徑名從文件系統(tǒng)樹中找到信息節(jié)點(diǎn)文件,其中保存的是要打開的文件的INode的信息。getBlockLocationsInternal的實(shí)現(xiàn)如下:私有同步locatedblockgetblocklocationsinternal(字符串src,索引節(jié)點(diǎn)文件索引節(jié)點(diǎn),長偏移,長的長度,int nrBlocksToReturn,布爾doAccessTime)引發(fā)io異常/得到此文件的街區(qū)信息塊塊=inode。GetBlocks();列表結(jié)果=新數(shù)組列表(塊長度);/計(jì)算從抵消開始,長度為長度所涉及的阻礙int CurbiLk=0;long curPos=0,BLKSize=0;int nrBloc

7、ks=(塊0.getNumBytes()=0)?0 :塊,長度;for(Curblk=0;路緣石;路緣)blkSize=塊路緣石.getNumBytes();if (curPos blkSize偏移量)/當(dāng)?shù)窒赾urPos和curPos blkSize之間的時(shí)候,路緣指向抵消所在的街區(qū)休息;curPos=blkSize .長結(jié)束=偏移長度;/循環(huán),依次遍歷從路邊人行道開始的每個(gè)街區(qū),直到當(dāng)前位置curPos越過結(jié)束做int numNodes=blocksmap。numNodes(塊Curblk);int numCorruptNodes=countNodes(塊路緣).損壞副本();int N

8、umCorruptReplicans=CorruptReplicans。NumCorruptReplicans(塊抑制鏈接);布爾塊損壞=(numCorruptNodes=numNodes);int numMachineSet=塊損壞?編號(hào):(numNodes-numCorruptNodes);/依次找到此街區(qū)所對(duì)應(yīng)的datanode,將其中沒有損壞的放入機(jī)器設(shè)置中數(shù)據(jù)節(jié)點(diǎn)描述符機(jī)器集=新數(shù)據(jù)節(jié)點(diǎn)描述符Nummachineset;if (numMachineSet 0) numNodes=0;對(duì)于(迭代器它=blocksmap。節(jié)點(diǎn)迭代器(塊Curblk);它。HasNext();)數(shù)據(jù)節(jié)點(diǎn)描

9、述符dn=it。next();布爾復(fù)制損壞=損壞復(fù)制損壞。isReplicaCorrupt(阻止抑制鏈接,dn);if (blockCorrupt |(!封鎖腐??!復(fù)制腐敗)機(jī)器集NumNodes=dn;/使用此機(jī)器設(shè)置和當(dāng)前的街區(qū)構(gòu)造一個(gè)LocatedBlock結(jié)果。添加(新定位塊(塊路緣,機(jī)器設(shè)置,庫位,塊損壞);curPos=blockscurBlk.getNumBytes();路緣;同時(shí)(結(jié)束關(guān)閉)路緣長度結(jié)果。大小()NRblockStoreTurn);/使用此LocatedBlock鏈表構(gòu)造一個(gè)定位塊對(duì)象返回返回inode.createLocatedBlocks(結(jié)果);1.3、客

10、戶端通過RPC調(diào)用,在名稱節(jié)點(diǎn)得到的定位塊對(duì)象,作為成員變量構(gòu)造DFSInputStream對(duì)象,最后包裝為FSDataInputStream返回給用戶。二、文件的讀取2.1、客戶端文件讀取的時(shí)候,客戶端利用文件打開的時(shí)候得到的FSDataInputStream.read(長位置,字節(jié)緩沖區(qū),int偏移量,int長度)函數(shù)進(jìn)行文件讀操作。FSDataInputStream會(huì)調(diào)用其封裝的DFSInputStream的讀取(長位置,字節(jié)緩沖區(qū),int偏移量,int長度)函數(shù),實(shí)現(xiàn)如下:公共int讀?。ㄩL位置,字節(jié)緩沖區(qū),int偏移量,int長度)引發(fā)io異常long filelen=GetFile

11、Length();int realLen=長度;如果(位置長度)filelen) 實(shí)數(shù)=(整數(shù))(filelen -位置);/首先得到包含從抵消到偏移長度內(nèi)容的街區(qū)列表/比如對(duì)于64M一個(gè)街區(qū)的文件系統(tǒng)來說,欲讀取從100米開始,長度為128米的數(shù)據(jù),則街區(qū)列表包括第2,3,4塊街區(qū)列表塊范圍=getBlockRange(位置,實(shí)際值);int剩余=realLen/對(duì)每一個(gè)街區(qū),從中讀取內(nèi)容/對(duì)于上面的例子,對(duì)于第2塊街區(qū),讀取從36M開始,讀取長度28M,對(duì)于第3塊,讀取整一塊64M,對(duì)于第4塊,讀取從0開始,長度為36M,共128米數(shù)據(jù)用于(LocatedBlock blk : BlockRange)長目標(biāo)開始=位置-黑色。GetStartOffset();長字節(jié)讀取=數(shù)學(xué)分鐘(剩余,blk.getBlockSize() -目標(biāo)開始);fetchBlockByteRange(blk,targetStart,目標(biāo)開始字節(jié)讀取- 1,緩沖區(qū),偏移量);剩余-=字節(jié)讀取;位置=字節(jié)讀取

溫馨提示

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