HDFS讀取文件步驟

  1. client調用FileSystem.open(),該FileSystem指向的實例是DistrbutedFileSystem(DFS),它通過RPC請求到Namenode.
  2. Namenode收到請求後,對於每一個塊返回存有該副本的Datanode地址。並且依照“網絡拓撲”來排序。(就近原則)
  3. DFS獲取到BlockLocations後,可以根據當前讀取偏移量計算指定DataNode並進行通訊,返回一個FSDataInputStream,該對象管理DataNode和NameNode的I/O, 客戶端反覆調用stream.read()方法獲取數據 (這步包含了權威指南的3,4步驟)。
  4. 到達塊的末端時,stream關閉與當前交互的DataNode的連接,繼續尋找下一個最佳的DataNode再執行步驟3操作
  5. client從stream讀取數據時,塊是按照打開stream和DataNode的順序讀取的,它也會詢問NameNode來檢索下一批數據塊DataNode的位置。(《權威指南第三版》76頁倒數第4行描述有誤,事實上一次性獲取了完整的BlockLocations) 一旦client讀取完成,就對stream執行close操作
    
    上述流程是在正常讀取,並且沒有發生故障的理想情況下。

    
補充:
    


總結:
    這個設計的重點是,NameNode告知客戶端每個塊中最佳的DataNode,並讓客戶端直接連接到該DataNode檢索數據。由於數據流分散在集羣中的所有DataNode,所以這種設計能使HDFS可擴展到大量的併發客戶端。同時,NameNode只需要響應塊位置的請求(這些信息存儲在內存中,所以非常高效),無須響應數據請求,否則隨着客戶端數量的增長,NameNode會很快成爲瓶頸。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章