寫數據流程
注意:微信
- 客戶端先實例化一個分佈式文件系統的類,並建立輸出流
FSDataOutputStream
的對象.
-
FSDataOutputStream
會向NameNode請求上傳文件到XXX路徑
- NameNoed 會先作一系列檢測,好比文件是否已存在,若存在則返回文件已存在的錯誤,用戶是否有權限。若沒有問題則返回能夠上傳的消息。
- 客戶端須要知道本身應該把文件上傳到哪一個DataNode,所以依然由
FSDataOutputStream
向NameNode 詢問.
- NameNode根據到客戶端的節點距離 返回相應的DataNode及位置 如dn1,dn2,dn3三個節點(備份)
- 客戶端向DataNode1請求創建Block傳輸通道,DataNode1收到請求後 向DataNode2一樣發送創建通道請求,DataNode2也向DataNode3發送...
- DataNode 從後往前依次迴應,最後返回給客戶端
- 客戶端開始以packet的形式傳遞數據給DataNode1, DataNode1把數據先存至內存隊列ByteBuff當中,並將該數據序列化後存至本地Block,同時ByteBuffer的數據會傳給DataNode2的ByteBuffer,...
- 數據接收完畢後 從後面依次應答 傳遞完畢,最後應答給客戶端, 客戶端再向NameNode迴應 傳輸完成的消息
再從代碼層面理解這個過程
讀數據過程
1.先建立一個DFS實例,向NameNode發送下載請求分佈式
- NameNode 返回該文件的元數據,包括了數據塊的起始位置
- 客戶端向DataNode 請求讀取數據塊
- 若是須要的數據塊在一臺機器上 則一次傳輸就返回。若該數據塊損壞或不在該DataNode上 則還須要去相應的DataNode以相同的方式請求數據
- 客戶端收到數據後寫入本地磁盤.
代碼層面
節點距離計算
節點距離: 兩個節點到達最小公共祖先的距離和
最小公共祖先 通常指 機架,集羣的路由器
例子:
spa