1、HDFS寫數據(宏觀):
1、首先,客戶端發送一個寫數據的請求,通過rpc與NN建立連接,NN會做一些簡單的校驗,文件是否存在,是否有空間存儲數據等。
2、NN就會將校驗的結果發送給客戶端,客戶端就會向NN發送請求,第一個block存儲在哪個DN中。
3、NN接受客戶端請求,就會根據block塊以及副本的數量來分配DN,并將對應的DN的地址返回給客戶端。
4、客戶端會向第一個DN發送請求,上傳數據,第一個DN接受到以后就會向下一個DN發送請求,直到最后一個DN,將整個pipline管道創建成功,在返回給客戶端。
5、此時客戶端會將block切分成多個package,以package的形式傳遞到DN中,在pipiline中依次傳輸,當傳輸到最后一個DN的時候,就會返回一個ack響應,當客戶端接收到最后一個DN傳輸過來的ack,此時package就傳輸完成,然后一次傳輸package。
6、當第一個block傳輸完成以后,客戶端就會請求NN上傳第二個block。
7、當所有的package傳輸完成后,管道就會關閉,數據傳輸成功。
2、HDFS寫數據請求(微觀:保證了在傳輸的過程中package不會發生錯誤):
1、首先,客戶端發送寫數據的請求,將磁盤中的數據從內存中提取出來,存放在客戶端的內存中。
2、當客戶端與NN之間通過rpc建立聯系后,獲取到第一個block存在的DN的地址,然后向第一個DN中發送寫數據的請求,第一個DN接收到后調用下一個DN,以此類推,在所有的DN之間建立pipline管道。
3、當pipline管道建立后,客戶端此時對每一個block在進行切分,分成多個package。
4、在客戶端,為了防止在傳輸過程package不會出錯,就會產生了兩個兩個隊列,分別是數據隊列(dataqueue)和確認隊列(Ackqueue)。
5、此時會將緩存中的package讀取到數據隊列,同時也會復制一份到確認隊列中?
6、然后數據隊列就會上傳數據,然后通過Pipline管道分別就是package依次發送到對應的dn中
7、當客戶端發送第一個package的時候,會有一個進程responseprosessor進程用來接收DN傳來的ack的響應,如果接受到的ack是true,說明這個package傳輸成功,此時ackqueue中的package就會刪除,反之ackqueue會將package復制一份給dataqueue重新發送,一直到收到的ack的狀態時true。
3、HDFS的讀數據請求:
1、客戶端通過rpc與NN建立連接,發送讀數據的請求
2、NN根據客戶端的請求,NN將block以及對應副本所對應的DN的地址返回返回個客戶端。
3、客戶端會根據返回來的DN地址,會根據網絡拓撲結構計算出與客戶端的距離,然后進行排序。
4、客戶端會選擇距離較近的DN中去讀取block,如果客戶端就在DN中,就會在自生讀取block,當block讀取完成后,文件讀取還沒有結束,此時客戶段會向NN繼續發送讀數據的請求,獲取下一批的block的地址。
5、最終客戶端會將這些讀取的block合并成一個文件。
4、package的結構:
1、package主要分成兩個部分:package? header 和package? data
一般的大小是64kb
haeder中存放的是:offset in block (在block中的偏移量),last packet in block (是不是block中的最后一個packet)
packdata中存放的是:chunk data (存儲的數據),chunk checksum(校驗文件,與chunkdata是一一對應的)