1. Client 發起文件上傳請求, 通過 RPC 與 NameNode 建立通訊, NameNode 檢查目標文件是否已存在, 父目錄是否存在, 返回是否可以上傳
2. Client 請求第一個 block 該傳輸到哪些 DataNode 服務器上
3. NameNode 根據配置文件中指定的備份數量及機架感知原理進行文件分配, 返回可用的DataNode 的地址如: A, B, CHadoop 在設計時考慮到數據的安全與高效, 數據文件默認在 HDFS 上存放三份, 存儲策略為本地一份, 同機架內其它某一節點上一份, 不同機架的某一節點上一份。
4. Client 請求 3 台 DataNode 中的一台 A 上傳數據(本質上是一個 RPC 調用,建立 pipeline), A 收到請求會繼續調用 B, 然后 B 調用 C, 將整個 pipeline 建立完成, 后逐級返回client
5. Client 開始往 A 上傳第一個 block(先從磁盤讀取數據放到一個本地內存緩存), 以packet 為單位(默認64K), A 收到一個 packet 就會傳給 B, B 傳給 C. A 每傳一個 packet 會放入一個應答隊列等待應答
6. 數據被分割成一個個 packet 數據包在 pipeline 上依次傳輸, 在 pipeline 反方向上, 逐個發送 ack(命令正確應答), 最終由 pipeline 中第一個 DataNode 節點 A 將 pipelineack 發送給 Client
7. 當一個 block 傳輸完成之后, Client 再次請求 NameNode 上傳第二個 block 到服務 1