(六)HDFS架構(gòu)設(shè)計(jì)及文件讀寫流程

主從架構(gòu)

NameNode(NN): 名稱節(jié)點(diǎn)

DataNode(DN):數(shù)據(jù)節(jié)點(diǎn)

Secondarynamenode(SNN):第二名稱節(jié)點(diǎn)

rack指的是機(jī)架,可以理解為一個網(wǎng)段

1.NameNode:

存儲:文件系統(tǒng)的命名空間(存儲在內(nèi)存里),包括:a.文件名稱;b.文件目錄結(jié)構(gòu);c.文件屬性(權(quán)限、創(chuàng)建時間、副本數(shù)等);d.文件對應(yīng)哪些數(shù)據(jù)塊,數(shù)據(jù)塊分配在哪些節(jié)點(diǎn)上;

[當(dāng)然namenode節(jié)點(diǎn)不會持久的存儲這種映射關(guān)系,是通過集群在啟動和運(yùn)時,datanode 定期發(fā)送blockReport給namenode,以此namenode在內(nèi)存中來動態(tài)維護(hù)的這種 映射關(guān)系]

作用:管理文件系統(tǒng)的命名空間。它維護(hù)著文件系統(tǒng)樹及整棵樹內(nèi)所有的文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上:命名空間鏡像文件fsimage和編輯日志文editlog。

2.DataNode:

存儲:數(shù)據(jù)塊和數(shù)據(jù)塊的校驗(yàn)和(存儲在磁盤上)

與NN通信:a.每隔3秒發(fā)送一次心跳;b.每隔10次心跳發(fā)送一次blockreport

作用:讀寫文件的數(shù)據(jù)塊

3.Secondarynamenode:

存儲:命令空間鏡像文件 ? fsimage+編輯日志editlog

作用:checkpoint(俗稱檢查點(diǎn)動作):定期合并fsimage+editlog為新的fsimage,然后推送給NN

隔1小時備份一次

4.數(shù)據(jù)塊 block

默認(rèn)數(shù)據(jù)塊大小:128M

假如一個文件大小為130M,則需要切分為2個塊,1個為128M,另一個為2M(注意并不是128M,實(shí)際是多大block塊就有多大)

5.副本數(shù) replication

默認(rèn)副本數(shù):3

Question:一個文件大小為260M,請問存儲為多大,多少個塊?

Answer:若副本數(shù)為1,則存儲為260M,3個塊;

? ? ? ? ? ? ? ? ?若副本數(shù)為3,則存儲為780M,9個塊

6.副本放置策略

7.文件讀流程

(1)Client通過FileSystem.open(filePath)方法,去與Namenode進(jìn)行rpc通信,namenode先校驗(yàn)該路徑和文件是否存在,若存在則返回該文件的部分或全部的block列表(也包含該列表各block的分布在Datanode地址的列表),也就是返回FSDataInputStream對象;

(2)Client調(diào)用FSDataInputStream對象的read()方法,

a.去與第一個塊的最近的datanode進(jìn)行read,讀取完后,會check,假如successful,會關(guān)閉 與當(dāng)前

Datanode通信;(假如check fail,會記錄失敗的塊+Datanode信息,下次就不會讀取;那么會去該塊的第二個Datanode地址讀取);

b.然后去第二個塊的最近的Datanode上的進(jìn)行讀取,check后,會關(guān)閉與此datanode的通信。

c.假如block列表讀取完了,文件還未結(jié)束,那么FileSystem會從Namenode獲取下一批的block的列表。(當(dāng)然讀操作對于Client端是透明的,感覺就是連續(xù)的數(shù)據(jù)流)

(3)Client調(diào)用FSDataInputStream.close()方法,關(guān)閉輸入流。

8.文件寫流程

(1)Client調(diào)用FileSystem.create(filePath)方法,去與Namenode進(jìn)行rpc通信,check該路徑的文件是否存在以及有沒有權(quán)限創(chuàng)建該文件,假如ok,就創(chuàng)建一個新文件,但是并不關(guān)聯(lián)任何block,返回一個FSDataOutputStream對象;(假如not ok,就返回錯誤信息,所以寫代碼要try-catch)

(2)Client調(diào)用FSDataOutputStream對象的write()方法,會將第一個塊寫入第一個Datanode,第一個Datanode寫完傳給第二個節(jié)點(diǎn),第二個寫完傳給第三節(jié)點(diǎn),當(dāng)?shù)谌齻€節(jié)點(diǎn)寫完返回一個ack packet給第二個節(jié)點(diǎn),第二個返回一個ack packet給第一個節(jié)點(diǎn),第一個節(jié)點(diǎn)返回ack packet給

FSDataOutputStream對象,意思標(biāo)識第一個塊寫完,副本數(shù)為3;然后剩余的塊依次這樣寫;

(當(dāng)然寫操作對于Client端也是透明的)

(3)當(dāng)向文件寫入數(shù)據(jù)完成后,Client調(diào)用FSDataOutputStream.close()方法,關(guān)閉輸出流,flush緩存區(qū)的數(shù)據(jù)包;

(4)再調(diào)用FileSystem.complete()方法,告訴Namenode節(jié)點(diǎn)寫入成功。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容