1. 程式人生 > >大資料開發之Hadoop篇----hdfs讀流程

大資料開發之Hadoop篇----hdfs讀流程

讀流程所涉及到的有client,NameNode和DataNode這個三個,我們來了解下這三個之間在讀流程裡都是幹什麼的。

1,當我們輸入一條讀入資料的命令的時候,如:hdfs dfs -ls /  或者 hdfs dfs -cat /user/hadoop/xxx時,client就通過DistributedFileSystem這個物件的open方法去和NameNode進行rpc通訊,其中open方法會將一個path路徑傳遞過去,這個path路徑就是我們要檢視的檔案或者資料夾的路徑。NameNode會對這個path進行交驗,判斷是否存在這個路徑以及你要讀取的路徑你是否擁有許可權去讀取,如果都沒問題的話就接著第二步,否則報錯。

2,交驗完成後,NameNode將會返回要讀取的檔案的全部或者一部分block列表(其實就是返回一個FSDataInputStream物件),這些就是blockmap的內容嘛,還記不記得前幾篇的有介紹到hdfs的寫流程,其中說到DataNode會返回心跳包給NameNode以及每隔10個心跳包就會返回一個blockmap給NameNode,裡面就記錄了每個檔案所對應的block以及其儲存的節點位置。

3,client呼叫FSDataInputStream物件的read方法去讀取每一個block最近地址的副本(雖然有多個副本但是並不是要讀取全部副本的,所以會根據一個演算法來讀取離client最近節點上的副本),讀取完成後回去交驗這個block是否有損壞,假如沒有任何問題會自動關閉與當前DataNode的通訊。如果check失敗了,會記錄下這個受損的block在哪個DataNode節點上,下次不會再讀取了。

4,然後就是下個block的讀取,當我們把block列表裡面的block讀取完後,檔案還沒有結束將繼續向NameNode申請下一批block列表。

5,最後client呼叫FSDataInputStream物件的close方法關閉輸入流。