1. 程式人生 > >hadoop讀取檔案流程分析

hadoop讀取檔案流程分析

在讀取HDFS上的檔案時,Client、NameNode以及DataNode都會相互關聯。按照一定的順序來實現讀取這一過程,讀取過程如下圖所示:

  通過上圖,讀取HDFS上的檔案的流程可以清晰的知道,Client通過例項開啟檔案,找到HDFS叢集的具體資訊(我們需要操作的是 ClusterA,還是ClusterB,需要讓Client端知道),這裡會建立一個輸入流,這個輸入流是連線DataNode的橋樑,相關資料的讀取 Client都是使用這個輸入流來完成的,而在輸入流建立時,其建構函式中會通過一個方法來獲取NameNode中DataNode的ID和Block的 位置資訊。Client在拿到DataNode的ID和Block位置資訊後,通過輸入流去讀取資料,讀取規則按照“就近原則”,即:和最近的 DataNode建立聯絡,Client反覆呼叫read方法,並將讀取的資料返回到Client端,在達到Block的末端時,輸入流會關閉和該 DataNode的連線,通過向NameNode獲取下一個DataNode的ID和Block的位置資訊(若物件中為快取Block的位置資訊,會觸發 此步驟,否則略過)。然後拿到DataNode的ID和Block的位置資訊後,在此連線最佳的DataNode,通過此DataNode的讀資料介面, 來獲取資料。

  另外,每次通過向NameNode回去Block資訊並非一次性獲取所有的Block資訊,需得多次通過輸入流向NameNode請求,來獲取 下一組Block得位置資訊。然而這一過程對於Client端來說是透明的,它並不關係是一次獲取還是多次獲取Block的位置資訊,Client端在完 成資料的讀取任務後,會通過輸入流的close()方法來關閉輸入流。

  在讀取的過程當中,有可能發生異常,如:節點掉電、網路異常等。出現這種情況,Client會嘗試讀取下一個Block的位置,同時,會標記該 異常的DataNode節點,放棄對該異常節點的讀取。另外,在讀取資料的時候會校驗資料的完整性,若出現校驗錯誤,說明該資料的Block已損壞,已損 壞的資訊會上報給NameNode,同時,會從其他的DataNode節點讀取相應的副本內容來完成資料的讀取。Client端直接聯絡 NameNode,由NameNode分配DataNode的讀取ID和Block資訊位置,NameNode不提供資料,它只處理Block的定位請 求。這樣,防止由於Client的併發資料量的迅速增加,導致NameNode成為系統“瓶頸”(磁碟IO問題)。