文件寫入
1.客戶端通過對DistributedFileSystem對象調用create()函數來創建文件
2.DistributedFileSystem對NameNode創建一個RPC調用,在文件系統的命名空間中創建文件名,但是沒有相應的數據塊。
3.在客戶端寫入數據時,FSDataOutputStream將數據分為一個個的數據包,并寫入數據隊列,同時向namenode申請一個新的block來存放數據。
4.將數據隊列中的數據寫入到一個datanode中,其余datanode之間(管道線pipeline)傳數據包。
5.直到收到所有datanode的確認信息后,該數據包才會從確認隊列刪除。
6.客戶端完成所有數據包的寫入后,會對數據流調用close()方法。
7.通知namenode寫入成功。
文件讀取
1.客戶端通過調用DistributedFileSystem對象的open()方法來打開希望讀取的文件。
2.DistributedFileSystem通過RPC調用namenode,確定文件起的位置。
3.客戶端對輸入流調用read()方法。
4.對數據流反復調用read()方法,將數據從datanode傳輸到客戶端。
5.當讀到block的末尾時,轉而讀下一個block。
文件復制
Namenode發現文件的文件快不符合最小復制數或者Datanode失效時,Namenode就通知Datanode相互復制文件塊,Datanode開始互相復制。默認的布局策略時同一個機架不同節點放一個副本、不同機架的節點上放一個副本。