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建立傳輸通道,然后傳輸資料,依次往下,直到下載到目標檔案為止,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26154.html
標籤:大數據
上一篇:求問資料庫按照日期和星期排序?
下一篇:求助,shell腳本
