您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么理解Hadoop中的HDFS,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
HDFS(Hadoop Distributed File System)默認的最基本的存儲單位是64M的數(shù)據(jù)塊。
和普通文件系統(tǒng)相同的是,HDFS中的文件是被分成64M一塊的數(shù)據(jù)塊存儲的。
不同于普通文件系統(tǒng)的是,HDFS中,如果一個文件小于一個數(shù)據(jù)塊的大小,并不占用整個數(shù)據(jù)塊存儲空間。
元數(shù)據(jù)節(jié)點用來管理文件系統(tǒng)的命名空間
其將所有的文件和文件夾的元數(shù)據(jù)保存在一個文件系統(tǒng)樹中。
這些信息也會在硬盤上保存成以下文件:命名空間鏡像(namespace image)及修改日志(edit log)
其還保存了一個文件包括哪些數(shù)據(jù)塊,分布在哪些數(shù)據(jù)節(jié)點上。然而這些信息并不存儲在硬盤上,而是在系統(tǒng)啟動的時候從數(shù)據(jù)節(jié)點收集而成的。
數(shù)據(jù)節(jié)點是文件系統(tǒng)中真正存儲數(shù)據(jù)的地方。
客戶端(client)或者元數(shù)據(jù)信息(namenode)可以向數(shù)據(jù)節(jié)點請求寫入或者讀出數(shù)據(jù)塊。
其周期性的向元數(shù)據(jù)節(jié)點回報其存儲的數(shù)據(jù)塊信息。
從元數(shù)據(jù)節(jié)點(secondary namenode)
從元數(shù)據(jù)節(jié)點并不是元數(shù)據(jù)節(jié)點出現(xiàn)問題時候的備用節(jié)點,它和元數(shù)據(jù)節(jié)點負責不同的事情。
其主要功能就是周期性將元數(shù)據(jù)節(jié)點的命名空間鏡像文件和修改日志合并,以防日志文件過大。這點在下面會相信敘述。
合并過后的命名空間鏡像文件也在從元數(shù)據(jù)節(jié)點保存了一份,以防元數(shù)據(jù)節(jié)點失敗的時候,可以恢復。
VERSION文件是java properties文件,保存了HDFS的版本號。
layoutVersion是一個負整數(shù),保存了HDFS的持續(xù)化在硬盤上的數(shù)據(jù)結構的格式版本號。
namespaceID是文件系統(tǒng)的唯一標識符,是在文件系統(tǒng)初次格式化時生成的。
cTime此處為0
storageType表示此文件夾中保存的是元數(shù)據(jù)節(jié)點的數(shù)據(jù)結構。
namespaceID=1232737062 cTime=0 storageType=NAME_NODE layoutVersion=-18 |
當文件系統(tǒng)客戶端(client)進行寫操作時,首先把它記錄在修改日志中(edit log)
元數(shù)據(jù)節(jié)點在內(nèi)存中保存了文件系統(tǒng)的元數(shù)據(jù)信息。在記錄了修改日志后,元數(shù)據(jù)節(jié)點則修改內(nèi)存中的數(shù)據(jù)結構。
每次的寫操作成功之前,修改日志都會同步(sync)到文件系統(tǒng)。
fsimage文件,也即命名空間映像文件,是內(nèi)存中的元數(shù)據(jù)在硬盤上的checkpoint,它是一種序列化的格式,并不能夠在硬盤上直接修改。
同數(shù)據(jù)的機制相似,當元數(shù)據(jù)節(jié)點失敗時,則最新checkpoint的元數(shù)據(jù)信息從fsimage加載到內(nèi)存中,然后逐一重新執(zhí)行修改日志中的操作。
從元數(shù)據(jù)節(jié)點就是用來幫助元數(shù)據(jù)節(jié)點將內(nèi)存中的元數(shù)據(jù)信息checkpoint到硬盤上的
checkpoint的過程如下:
從元數(shù)據(jù)節(jié)點通知元數(shù)據(jù)節(jié)點生成新的日志文件,以后的日志都寫到新的日志文件中。
從元數(shù)據(jù)節(jié)點用http get從元數(shù)據(jù)節(jié)點獲得fsimage文件及舊的日志文件。
從元數(shù)據(jù)節(jié)點將fsimage文件加載到內(nèi)存中,并執(zhí)行日志文件中的操作,然后生成新的fsimage文件。
從元數(shù)據(jù)節(jié)點獎新的fsimage文件用http post傳回元數(shù)據(jù)節(jié)點
元數(shù)據(jù)節(jié)點可以將舊的fsimage文件及舊的日志文件,換為新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,寫入此次checkpoint的時間。
這樣元數(shù)據(jù)節(jié)點中的fsimage文件保存了最新的checkpoint的元數(shù)據(jù)信息,日志文件也重新開始,不會變的很大了。
數(shù)據(jù)節(jié)點的VERSION文件格式如下:
namespaceID=1232737062 storageID=DS-1640411682-127.0.1.1-50010-1254997319480 cTime=0 storageType=DATA_NODE layoutVersion=-18 |
blk_<id>保存的是HDFS的數(shù)據(jù)塊,其中保存了具體的二進制數(shù)據(jù)。
blk_<id>.meta保存的是數(shù)據(jù)塊的屬性信息:版本信息,類型信息,和checksum
當一個目錄中的數(shù)據(jù)塊到達一定數(shù)量的時候,則創(chuàng)建子文件夾來保存數(shù)據(jù)塊及數(shù)據(jù)塊屬性信息。
客戶端(client)用FileSystem的open()函數(shù)打開文件
DistributedFileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點,得到文件的數(shù)據(jù)塊信息。
對于每一個數(shù)據(jù)塊,元數(shù)據(jù)節(jié)點返回保存數(shù)據(jù)塊的數(shù)據(jù)節(jié)點的地址。
DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數(shù)據(jù)。
客戶端調(diào)用stream的read()函數(shù)開始讀取數(shù)據(jù)。
DFSInputStream連接保存此文件第一個數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點。
Data從數(shù)據(jù)節(jié)點讀到客戶端(client)
當此數(shù)據(jù)塊讀取完畢時,DFSInputStream關閉和此數(shù)據(jù)節(jié)點的連接,然后連接此文件下一個數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點。
當客戶端讀取完畢數(shù)據(jù)的時候,調(diào)用FSDataInputStream的close函數(shù)。
在讀取數(shù)據(jù)的過程中,如果客戶端在與數(shù)據(jù)節(jié)點通信出現(xiàn)錯誤,則嘗試連接包含此數(shù)據(jù)塊的下一個數(shù)據(jù)節(jié)點。
失敗的數(shù)據(jù)節(jié)點將被記錄,以后不再連接。
客戶端調(diào)用create()來創(chuàng)建文件
DistributedFileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點,在文件系統(tǒng)的命名空間中創(chuàng)建一個新的文件。
元數(shù)據(jù)節(jié)點首先確定文件原來不存在,并且客戶端有創(chuàng)建文件的權限,然后創(chuàng)建新文件。
DistributedFileSystem返回DFSOutputStream,客戶端用于寫數(shù)據(jù)。
客戶端開始寫入數(shù)據(jù),DFSOutputStream將數(shù)據(jù)分成塊,寫入data queue。
Data queue由Data Streamer讀取,并通知元數(shù)據(jù)節(jié)點分配數(shù)據(jù)節(jié)點,用來存儲數(shù)據(jù)塊(每塊默認復制3塊)。分配的數(shù)據(jù)節(jié)點放在一個pipeline里。
Data Streamer將數(shù)據(jù)塊寫入pipeline中的第一個數(shù)據(jù)節(jié)點。第一個數(shù)據(jù)節(jié)點將數(shù)據(jù)塊發(fā)送給第二個數(shù)據(jù)節(jié)點。第二個數(shù)據(jù)節(jié)點將數(shù)據(jù)發(fā)送給第三個數(shù)據(jù)節(jié)點。
DFSOutputStream為發(fā)出去的數(shù)據(jù)塊保存了ack queue,等待pipeline中的數(shù)據(jù)節(jié)點告知數(shù)據(jù)已經(jīng)寫入成功。
如果數(shù)據(jù)節(jié)點在寫入的過程中失?。?/p>
關閉pipeline,將ack queue中的數(shù)據(jù)塊放入data queue的開始。
當前的數(shù)據(jù)塊在已經(jīng)寫入的數(shù)據(jù)節(jié)點中被元數(shù)據(jù)節(jié)點賦予新的標示,則錯誤節(jié)點重啟后能夠察覺其數(shù)據(jù)塊是過時的,會被刪除。
失敗的數(shù)據(jù)節(jié)點從pipeline中移除,另外的數(shù)據(jù)塊則寫入pipeline中的另外兩個數(shù)據(jù)節(jié)點。
元數(shù)據(jù)節(jié)點則被通知此數(shù)據(jù)塊是復制塊數(shù)不足,將來會再創(chuàng)建第三份備份。
當客戶端結束寫入數(shù)據(jù),則調(diào)用stream的close函數(shù)。此操作將所有的數(shù)據(jù)塊寫入pipeline中的數(shù)據(jù)節(jié)點,并等待ack queue返回成功。最后通知元數(shù)據(jù)節(jié)點寫入完畢。
關于怎么理解Hadoop中的HDFS就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。