- hdfs文件讀取過程
過程描述:node
(1)客戶端調用FileSyste對象的open()方法在分佈式文件系統中打開要讀取的文件。分佈式
(2)分佈式文件系統經過使用RPC(遠程過程調用)來調用namenode,肯定文件起始塊的位置。函數
(3)分佈式文件系統的DistributedFileSystem類返回一個支持文件定位的輸入流FSDataInputStream對象,FSDataInputStream對象接着封裝DFSInputStream對象(存儲着文件起始幾個塊的datanode地址),客戶端對這個輸入流調用read()方法。spa
(4)DFSInputStream鏈接距離最近的datanode,經過反覆調用read方法,將數據從datanode傳輸到客戶端。3d
(5) 到達塊的末端時,DFSInputStream關閉與該datanode的鏈接,尋找下一個塊的最佳datanode。對象
(6)客戶端完成讀取,對FSDataInputStream調用close()方法關閉鏈接。blog
- hdfs文件寫入過程
- 過程描述:
寫文件過程分析:隊列
(1) 客戶端經過對DistributedFileSystem對象調用create()函數來新建文件。class
(2) 分佈式文件系統對namenod建立一個RPC調用,在文件系統的命名空間中新建一個文件。集羣
(3)Namenode對新建文件進行檢查無誤後,分佈式文件系統返回給客戶端一個FSDataOutputStream對象,FSDataOutputStream對象封裝一個DFSoutPutstream對象,負責處理namenode和datanode之間的通訊,客戶端開始寫入數據。
(4)FSDataOutputStream將數據分紅一個一個的數據包,寫入內部隊列「數據隊列」,DataStreamer負責將數據包依次流式傳輸到由一組namenode構成的管線中。
(5)DFSOutputStream維護着確認隊列來等待datanode收到確認回執,收到管道中全部datanode確認後,數據包從確認隊列刪除。
(6)客戶端完成數據的寫入,對數據流調用close()方法。
(7)namenode確認完成
- Block的副本放置策略
第一個副本:放置在上傳文件的DN;若是是集羣外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點。
第二個副本:放置在於第一個副本不一樣的 機架的節點上。
第三個副本:與第二個副本相同機架的節點。
更多副本:隨機節點