1. HDFS讀數據流程
1、與NameNode通信查詢元數據,找到文件塊所在的DataNode服務器
2、挑選一台DataNode(網絡拓撲上的就近原則,如果都一樣,則隨機挑選一台DataNode)服務器,請求建立socket流
3、DataNode開始發送數據(從磁盤里面讀取數據放入流,以packet(一個packet為64kb)為單位來做校驗)
4、客戶端以packet為單位接收,先在本地緩存,然后寫入目標文件
流程如下:

2. HDFS寫數據流程
1、跟NameNode通信請求上傳文件,NameNode檢查目標文件是否已經存在,父目錄是否已經存在
2、NameNode返回是否可以上傳
3、Client先對文件進行切分,請求第一個block該傳輸到哪些DataNode服務器上
4、NameNode返回3個DataNode服務器DataNode 1,DataNode 2,DataNode 3
5、Client請求3台中的一台DataNode 1(網絡拓撲上的就近原則,如果都一樣,則隨機挑選一台DataNode)上傳數據(本質上是一個RPC調用,建立pipeline),DataNode 1收到請求會繼續調用DataNode 2,然后DataNode 2調用DataNode 3,將整個pipeline建立完成,然后逐級返回客戶端
6、Client開始往DataNode 1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以pocket為單位。寫入的時候DataNode會進行數據校驗,它並不是通過一個packet進行一次校驗而是以chunk為單位進行校驗(512byte)。DataNode 1收到一個packet就會傳給DataNode 2,DataNode 2傳給DataNode 3,DataNode 1每傳一個pocket會放入一個應答隊列等待應答
7、當一個block傳輸完成之后,Client再次請求NameNode上傳第二個block的服務器.
流程如下:


