文件寫(xiě)入

image.png
- 客戶端通過(guò)對(duì)DistributedFileSystem對(duì)象調(diào)用create()函數(shù)來(lái)創(chuàng)建文件
- DistributedFileSystem對(duì)NameNode創(chuàng)建一個(gè)RPC調(diào)用,在文件系統(tǒng)的命名空間中創(chuàng)建文件名,但是沒(méi)有相應(yīng)的數(shù)據(jù)塊
- 在客戶端寫(xiě)入數(shù)據(jù)時(shí),F(xiàn)SDataOutputStream將數(shù)據(jù)分為一個(gè)個(gè)的數(shù)據(jù)包,并寫(xiě)入數(shù)據(jù)隊(duì)列,同時(shí)向namenode申請(qǐng)一個(gè)新的block來(lái)存放數(shù)據(jù)。
- 將數(shù)據(jù)隊(duì)列中的數(shù)據(jù)寫(xiě)入到一個(gè)datanode中,其余datanode之間(管道線pipeline)傳數(shù)據(jù)包。
- 直到收到所有datanode的確認(rèn)信息后,該數(shù)據(jù)包才會(huì)從確認(rèn)隊(duì)列刪除
- 客戶端完成所有數(shù)據(jù)包的寫(xiě)入后,會(huì)對(duì)數(shù)據(jù)流調(diào)用close()方法
- 通知namenode寫(xiě)入成功。
文件讀取

image.png
- 客戶端通過(guò)調(diào)用DistributedFileSystem對(duì)象的open()方法來(lái)打開(kāi)希望讀取的文件。
- DistributedFileSystem通過(guò)RPC調(diào)用namenode,確定文件起的位置。
- 客戶端對(duì)輸入流調(diào)用read()方法。
- 對(duì)數(shù)據(jù)流反復(fù)調(diào)用read()方法,將數(shù)據(jù)從datanode傳輸?shù)娇蛻舳恕?/li>
- 當(dāng)讀到block的末尾時(shí),轉(zhuǎn)而讀下一個(gè)block。
文件復(fù)制
- NameNode發(fā)現(xiàn)文件的文件塊不符合最小復(fù)制數(shù)或者Datanode失效時(shí)
- NameNode就通知DataNode相互復(fù)制文件塊
- DataNode開(kāi)始互相復(fù)制。默認(rèn)的布局策略是同一個(gè)機(jī)架不同節(jié)點(diǎn)放一個(gè)副本、不同機(jī)架的節(jié)點(diǎn)上放一個(gè)副本。