存儲流程
a) Clinet首先將要存儲的數據切分成若干塊,然后向NameNode發送存儲請求,
b) NameNode檢查權限、存儲文件是否已存在等信息,確認無誤后返回允許存儲的響應,這個響應還包括第一個Block要放在哪個DataNode哪個的地址的信息。
c) Clinet得到NameNode的響應,打開文件輸出流,向第一個DataNode請求打開管道,DN1接受的信息后繼續通知DN2,DN2接受到DN1的信息后通知DN3,DN3接受到信息后確認沒有更多副本了,向DN2返回響應信息,DN2獲取到DN3的響應后向DN1返回響應,DN1得到響應后向Clinet返回響應
d) Clinet獲得響應后,確認pipeline(管線,管線上每個節點都能收到相同的數據流)已開通,開始寫入數據。
首先向向緩沖區chunkbuff中寫入,當達到一個chunk大小時(512byte),將chunk寫出到packetbuff,每個chunk有一個MD5碼(4byte),這個碼是由整個chunk的字節算出,因此一個chunk是516byte,當packetbuff達到一個packet大小時(64KB),將packet寫出到DataQueue,DN1 從DataQueue上獲取一個packet,packet會在pipeline里傳入到DN2、DN3,DN會檢驗packet中的各個chunk的MD5是否匹配,然后返回響應ack packet放到ack Queue中返回給clinet,如此保證數據的完整正確傳輸。
e) clinet確認block1完成傳輸后,向NameNode發送請求,確認block1已存入,NN更新自己的Fsimage,並返回block2的存儲地址
f) 重復,直到所有block都存入。
讀取流程
1)客戶端通過Distributed FileSystem向NameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。
2)挑選一台DataNode(就近原則,然后隨機)服務器,請求讀取數據。
3)DataNode開始傳輸數據給客戶端(從磁盤里面讀取數據輸入流,以packet為單位來做校驗)。
4)客戶端以packet為單位接收,先在本地緩存,然后寫入目標文件。