主從架構(gòu)
NameNode(NN): 名稱節(jié)點(diǎn)
DataNode(DN):數(shù)據(jù)節(jié)點(diǎn)
Secondarynamenode(SNN):第二名稱節(jié)點(diǎn)

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
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)寫入成功。