HDFS文件讀取過程

  1. Client向NameNode發起RPC請求,來確定請求文件block所在的位置
  2. NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode都會返回含有該block副本的DataNode地址;這些返回的DataNode地址,會按照集羣拓撲結構得出DataNode與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離Client近的排靠前,心跳機制中超時彙報的DataNode狀態爲STALE,這樣的排靠後。
  3. Client 選取排序靠前的DataNode來讀取block,如果客戶端本身就是DataNode,那麼將從本地直接獲取數據(短路讀取特性)
  4. 底層上本質是建立SocketStream(FSDataInputStream),重複的調用父類DataInputStream的read方法,直到這個塊上的數據讀取完畢。
  5. 當讀完列表的block後,若文件讀取還沒有結束,客戶端會繼續向NameNode獲取下一批的block列表;
  6. 讀取完一個block都會進行checksum驗證,如果讀取DataNode時出現錯誤,客戶端會通知NameNode,然後再從下一個擁有該block副本的DataNode繼續讀。
  7. read方法是並行讀取block信息,不是一塊一塊的讀取,NameNode只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據;
  8. 最終讀取的所有的block會合併成一個完整的最終文件。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章