hdfs 文件上傳過程
-
向 namenode 請求上傳文件
-
響應可以上傳文件
-
向 namenode 請求, 上傳到哪幾臺 dataNode
-
Namenode 返回,指定文件上傳的 datanode 節點數據
-
通過獲取到的 namenode 節點信息, 客戶端向一個節點發送通信, 開通數據通信管道
-
確認建立通道
-
創建 FSDataOutputStream
-
客戶端開始向 一個dataNode傳遞數據, 第一個 dataNode 將數據持久化到磁盤, 並通過內存, 向下一個 dataNode 傳遞副本, 直到傳遞最後一個指定 datanode
-
確認數據傳輸完成, 向前一個 namenode 或客戶端返回確認
-
客戶端將數據存儲到那麼datanode 節點的元數據信息傳遞給 namenode 存儲
網絡拓撲
namenode 向客戶端返回元數據下載位置, 是需要計算網絡節點距離的, 根據請求客戶端的位置計算最短距離:
- 計算同節點距離 例如: 集羣a-機架 1-node1, distance = 0
- 計算同機架距離 例如: 集羣a-機架 1-node1—> 集羣a-機架 1-node2, 機架相同, 各節點向上查找 1 distance=2
- 計算同集羣距離 例如: 集羣a-機架 1-node1—>集羣a-機架 2-node2, 集羣相同, 各節點向上查找 1 到機架, 再向上查找 1 到集羣 distance = 4
- 計算不同集羣距離 例如: 集羣a-機架 1-node1—>集羣b-機架 2-node2, 各節點向上查找 1 到機架, 再向上查找 1到集羣, 再向上查找 1 distance=6
機架感知(副本存儲節點選擇)
選擇存儲副本的節點, 例如有三個副本
- 副本一:根據 client 所處的客戶端, 找到相同節點, 存儲一份副本
- 副本二:根據副本一所處節點, 找到相同機架任意節點, 存儲一份副本
- 副本三:根據副本一所處節點, 找到不同機架任意節點, 存儲一份副本
hdfs 文件讀數據過程
- 客戶端向 namenode 請求下載數據
- namenode 返回目標文件的元數據
- 客戶端創建 FSDataInputStream 向獲取到的 dataNode 節點發起blk1數據請求
- dataNode 返回 blk1 數據
- 如果整個文件數據大於指定限制, 會有多個 block 塊, 向存儲了 blk2 的 namenode 發起數據請求
- namenode 返回數據
- 客戶端將獲取到的整個數據存儲到指定位置