hdfs的讀寫流程總結及問題分析及相關面試題


HDFS采用的是master/slaves這種主從的結構模型管理數據,這種結構模型主要由四個部分組成,分別是Client(客戶端)、Namenode(名稱節點)、Datanode(數據節點)和SecondaryNameNode。HDFS作為hadoop的分布式儲存框架,最重要的莫過於數據流的讀寫過程了,下面就HDFS得數據流的讀寫流程做個詳細的剖析。

HDFS的寫流程

首先寫操作的shell命令:

hdfs dfs -put ./file02 /file02   
hdfs dfs -copyFromLocal ./file02 /file02 FSDataOutputStream fsout = fs.create(path);fsout.write(byte[]) 
fs.copyFromLocal(path1,path2)

具體流程詳解:

如下圖所示是整個寫流程及原理(上傳)

 

 

1.客戶端向namenode發出請求上傳數據;

2.namenode在接到請求之后,開始查找元數據(查找是否存在這個目錄以及查詢上傳者是否有這個權限),查詢后向客戶端響應是否可以上傳數據。

3.客戶端接到響應之后,再開始請求上傳第一塊數據(數據分塊是由客戶端操作的),例如圖中的0-128m為第一塊數據。

4.namenode接到請求后,向客戶端返回datanode節點信息(副本放在哪個節點上,例如放在DN1,DN2,DN3這三台機器上)。一般規則有近遠遠,近遠近

5.客戶端根據返回的副本信息向datanode請求建立傳輸通道,以級聯的方式進行請求

6.datanode向客戶端響應,若都應答成功,則傳輸通道建立成功。

7.開始傳輸數據,以packet方式傳輸,以chunk為單位進行校驗,默認1m。

8.第一塊上傳成功,第二塊開始從3-7步驟繼續傳輸

9.待傳輸完成之后,客戶端向namenode報告數據傳輸遠程,由namenode更新元數據

 

在hdfs的寫流程有幾個核心問題:

1.傳輸blk1的過程中,dn3如果死了,集群會怎么處理?

不做任何處理,錯誤會想nn報告

2.接1,如果dn3又啟動了,集群會如何處理?

dn3啟動時,會向nn發送塊報告,然后nn指示dn3刪除blk1(因為傳輸數據不完整)

3.客戶端建立通道時,發現dn3連接不上,會怎么辦?

nn會重新分配三個節點

4.傳輸過程中,packet出錯,會如何處理?

會重新上傳,但是重傳次數只有4次,超過限制則提示傳輸失敗

5.如果bk1上傳成功,blk2壞了,或者blk2上傳時,dn1掛了,如何處理?

nn會將整個文件標記為無效,下次dn向nn發送塊報告時,nn會通知這些塊所在的節點刪除

 

HDFS的讀操作

首先讀操作的shell命令(下載)

 

hdfs dfs -get /file02 ./file02    
hdfs  dfs -copyToLocal  /file02 ./file02 FSDataInputStream fsis = fs.open(path); fsis.read(byte[] a) fs.copyToLocal(path1,path2) 

 

具體流程詳解

 

 由圖可知HDFS的讀流程要比寫流程簡單很多,主要步驟:

1.客戶端請求下載數據

2.nn檢測數據是否存在,給客戶端響應

3.客戶端請求下載第一塊數據

4.nn返回目標文件的元數據

5.客戶端請求dn建立傳輸通道

6.dn響應

7.開始傳輸數據

注意點:

在讀操作中在客戶端和dn建立傳輸通道時不是采用級聯方式,而是首先尋找離自己最近的副本(dn1)下載,如果數據不完整或者沒有找到,就再向dn2建立傳輸通道,然后傳輸數據,依次往下,直到下載到目標文件為止。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM