HDFS是Hadoop系統(tǒng)的存儲(chǔ)部分景鼠。它是塊結(jié)構(gòu)的文件系統(tǒng)帘腹,其中每個(gè)文件被分成預(yù)定大小的塊耽梅。這些塊存儲(chǔ)在一臺(tái)或多臺(tái)機(jī)器的集群中挨约。HDFS適用于兩種類型的節(jié)點(diǎn):NameNode(主節(jié)點(diǎn))和DataNodes(從節(jié)點(diǎn))
Hadoop NameNodes
NameNodes是HDFS文件系統(tǒng)的核心款慨。它們保留文件系統(tǒng)中所有文件的目錄樹儒飒,并跟蹤集群中數(shù)據(jù)的保存位置。它們不存儲(chǔ)這些文件的數(shù)據(jù)檩奠。這是一臺(tái)非常高效的機(jī)器桩了。客戶端應(yīng)用程序只要希望查找文件埠戳,或者想要添加/復(fù)制/移動(dòng)/刪除文件井誉,就可以與NameNode通信。NameNodes還執(zhí)行文件系統(tǒng)執(zhí)行整胃,例如命名颗圣,關(guān)閉和打開文件/目錄。所有DataNode都會(huì)將心跳和阻止報(bào)告發(fā)送到Hadoop集群中的NameNode。它確保DataNode存活在岂。塊報(bào)告包含datanode上所有塊的列表奔则。與namenode中的群集元數(shù)據(jù)關(guān)聯(lián)的主要文件是:
- EditLogs:包含最近對(duì)最新FsImage文件系統(tǒng)所做的所有修改。NameNodes從客戶端接收創(chuàng)建/更新/刪除請(qǐng)求蔽午。之后易茬,首先記錄此請(qǐng)求以編輯文件。
- FsImage:代表文件系統(tǒng)映像祠丝。它包含自NameNode創(chuàng)建以來的完整文件系統(tǒng)命名空間疾呻。文件和目錄由NameInode在inode中表示。Inode記錄屬性写半,如權(quán)限岸蜗,修改和訪問時(shí)間,或命名空間和磁盤空間配額叠蝇。
Hadoop DataNodes
這些是真實(shí)數(shù)據(jù)所在的商品硬件璃岳。這些也稱為從節(jié)點(diǎn)。多個(gè)數(shù)據(jù)節(jié)點(diǎn)組合在一起形成機(jī)架悔捶。DataNodes根據(jù)NameNode的指令阻止副本的創(chuàng)建铃慷,刪除和復(fù)制。DataNode將心跳發(fā)送到NameNode以報(bào)告HDFS數(shù)據(jù)的運(yùn)行狀況蜕该。默認(rèn)情況下犁柜,此頻率設(shè)置為3秒。
Secondary NameNodes
在HDFS中堂淡,當(dāng)NameNode啟動(dòng)時(shí)馋缅,它首先從FsImage文件中讀取HDFS文件的狀態(tài)。之后绢淀,它將應(yīng)用編輯日志文件中的編輯萤悴。NameNode然后將新的HDFS狀態(tài)寫入FsImage。然后它使用空的編輯文件開始正常操作皆的。在啟動(dòng)時(shí)覆履,NameNode與FsImage合并并編輯文件,因此編輯日志文件可能會(huì)隨著時(shí)間的推移而變得非常大费薄。較大的編輯文件的副作用是NameNode的下一次重新啟動(dòng)需要更長(zhǎng)時(shí)間硝全。輔助NameNode解決了此問題。輔助NameNode從NameNode下載FsImage和EditLogs楞抡,然后將編輯日志與FsImage(文件系統(tǒng)映像)合并伟众。它使編輯日志的大小保持在一個(gè)限制內(nèi)。它將修改后的FsImage存儲(chǔ)到持久存儲(chǔ)中,因此我們可以在NameNode失敗的情況下使用它。
HDFS如何工作
HDFS在以下假設(shè)下工作:一次寫入并經(jīng)常讀取八拱。
用HDFS寫
當(dāng)客戶端想要將文件寫入HDFS時(shí),它會(huì)與NameNode通信以獲取元數(shù)據(jù)数初。NameNode以許多塊,它們的位置梗顺,副本和其他詳細(xì)信息進(jìn)行響應(yīng)泡孩。根據(jù)NameNode的信息,客戶端將文件分成多個(gè)塊寺谤。之后仑鸥,它開始將它們發(fā)送到第一個(gè)DataNode。
客戶端首先使用其他兩個(gè)DataNode的詳細(xì)信息將塊A發(fā)送到DataNode 1变屁。當(dāng)DataNode 1從客戶端接收塊A時(shí)眼俊,DataNode 1將同一塊復(fù)制到同一機(jī)架的DataNode 2。由于兩個(gè)DataNode都在同一個(gè)機(jī)架中粟关,因此可以通過機(jī)架式交換機(jī)傳輸塊〈郑現(xiàn)在,DataNode 2將相同的塊復(fù)制到DataNode 3.由于兩個(gè)DataNode位于不同的機(jī)架中闷板,因此塊通過機(jī)架外交換機(jī)傳輸數(shù)據(jù)澎灸。當(dāng)DataNode從客戶端接收這些塊時(shí),它會(huì)向NameNode發(fā)送寫入確認(rèn)遮晚。對(duì)文件中的每個(gè)塊重復(fù)相同的過程性昭。
在HDFS中創(chuàng)建文件
如果客戶端必須在HDFS內(nèi)創(chuàng)建文件,則需要與NameNode進(jìn)行交互县遣。NameNode提供客戶端可以寫入其數(shù)據(jù)的所有從站的地址糜颠。客戶端還從NameNode獲取安全令牌艺玲,他們需要在寫入塊之前向從屬設(shè)備進(jìn)行身份驗(yàn)證括蝠。
要?jiǎng)?chuàng)建文件,客戶端將create()
在DistributedFileSystem上執(zhí)行該 方法》咕郏現(xiàn)在忌警,DistributedFileSystem通過創(chuàng)建一個(gè)RPC(遠(yuǎn)程過程調(diào)用)來與NameNode進(jìn)行交互,以創(chuàng)建一個(gè)在文件系統(tǒng)命名空間中沒有與之關(guān)聯(lián)的塊的新文件秒梳。NameNode執(zhí)行各種檢查法绵,以確保不存在此類文件,并且客戶端有權(quán)創(chuàng)建新文件酪碘。
如果這一切順利進(jìn)行朋譬,則NameNode會(huì)創(chuàng)建新文件的記錄; 否則,文件創(chuàng)建失敗兴垦,并向客戶端拋出IOException徙赢。FSDataOutputStream為客戶端返回DistributedFileSystem字柠,以便開始將數(shù)據(jù)寫入DataNode。與DataNode和客戶端的通信由DFSOutputStream處理狡赐,DFSOutputStream是FSDataOutputStream的一部分窑业。
讀入HDFS
這是一個(gè)相對(duì)容易的操作。此操作分兩步進(jìn)行:
- 客戶端與NameNode的交互枕屉。
- 客戶端與DataNode的交互常柄。
NameNodes包含有關(guān)哪個(gè)塊存儲(chǔ)在HDFS中哪個(gè)特定從站上的所有信息,哪些塊用于該特定文件搀擂。因此西潘,客戶端需要與NameNode交互以獲得實(shí)際存儲(chǔ)塊的從站的地址。NameNode將提供包含所需塊的從站的詳細(xì)信息哨颂。讓我們更詳細(xì)地了解客戶端和NameNode交互喷市。為了訪問存儲(chǔ)在HDFS中的塊,客戶端使用該命令發(fā)起請(qǐng)求 open()
獲取FileSystem對(duì)象的方法威恼,該對(duì)象是DistributedFileSystem的一部分《ǎ現(xiàn)在,F(xiàn)ileSystem將使用RPC(遠(yuǎn)程過程調(diào)用)與NameNode進(jìn)行交互沃测,以獲取包含客戶端請(qǐng)求的文件塊的從屬的位置缭黔。在此級(jí)別,NameNodes將檢查客戶端是否有權(quán)訪問該文件蒂破。如果是馏谨,則發(fā)送有關(guān)塊位置的信息。此外附迷,它還為客戶端提供了一個(gè)安全令牌惧互,客戶端需要向客戶端顯示這些令牌以進(jìn)行身份驗(yàn)證。
現(xiàn)在喇伯,在接收到包含塊的從設(shè)備的地址之后喊儡,客戶端將直接與從設(shè)備交互以讀取塊。數(shù)據(jù)將直接從從服務(wù)器流向客戶端(它不會(huì)通過NameNode流動(dòng))稻据“拢客戶端并行從多個(gè)從站讀取數(shù)據(jù)塊。讓我們更詳細(xì)地了解客戶端和NameNode交互捻悯〈以撸客戶端將通過FSDataInputStream對(duì)象向從屬服務(wù)器發(fā)送讀取請(qǐng)求〗窀浚客戶端和DataNode之間的所有交互都由DFSInputStream管理算柳,DFSInputStream是客戶端API的一部分⌒昭裕客戶端將向NameNode提供的從屬設(shè)備顯示身份驗(yàn)證令牌∷蚕睿現(xiàn)在蔗蹋,客戶端將使用InputStream API開始讀取塊,并且將從DataNode和客戶端連續(xù)傳輸數(shù)據(jù)囱淋。到達(dá)一個(gè)街區(qū)結(jié)束后纸颜,DFSInputStream關(guān)閉與DataNode的連接。讀取操作是高度優(yōu)化的绎橘,因?yàn)樗簧婕癗ataNode實(shí)際數(shù)據(jù)讀取,否則NameNode將成為瓶頸唠倦。由于采用分布式并行讀取機(jī)制称鳞,數(shù)千個(gè)客戶端可以非常有效地直接從DataNode讀取數(shù)據(jù)。