1. HDFS 寫數據流程
- 客戶端通過 Distributed FileSystem 模塊向 NameNode 請求上傳文件, NameNode 檢查目標文件是否已存在,父目錄是否存在;
- NameNode 返回是否可以上傳;
- 客戶端請求NameNode,獲取第一個 Block 上傳到哪幾個 DataNode 服務器上;
- NameNode 返回3個 DataNode 節點, 分別為 dn1, dn2, dn3;
- 客戶端通過 FSDataOutputStream 模塊請求 dn1 上傳數據, dn1 收到請求會繼續調用 dn2, 然后 dn2 調用 dn3,將這個通信管道建立完成;
- dn1, dn2, dn3 逐級應答客戶端;
- 客戶端開始往 dn1 上傳第一個 Block (先從磁盤讀取數據放到一個本地內存緩存), 以 Packet 為單位, dn1 收到一個 Packet 就會傳給 dn2, dn2 傳給 dn3;dn1 每傳一個 packet 會放入一個應答隊列等待應答;
- 當一個 Block 傳輸完成之后,客戶端再次請求 NameNode 上傳第二個 Block 的服務器。(重復執行 3-7 步)。
1.1 網絡拓撲--節點距離計算
- 在 HDFS 寫數據的過程中, NameNode 會選擇距離待上傳數據最近距離的 DataNode 接收數據。
- 如何計算最近距離?
- 節點距離:兩個節點到達最近的共同祖先的距離總和。
1.2 機架感知(副本存儲節點選擇)
2. HDFS 讀數據流程
**參考資料:** - [HDFS 文件IO流操作](https://www.bilibili.com/video/av32081351/?p=68)