先看下資料寫入的流程圖
一個packet寫入流程
以文字形式梳理上述步驟
目標將一個本地檔案a.txt上傳到hdfs檔案系統中,hdfs中預設blockSize=128M複製因子預設為3詳細步驟客戶端根據配置資訊與NameNode建立連線,並告訴NameNode,將a.txt檔案上傳到hdfs的/tmp/a.txt路徑NameNode生成一個值為1的blockId(用來建立對應blockId的block檔案),並根據複製因子3返回對應個數的可用來存放當前block的DataNode節點到客戶端,比如(DN1、DN2、DN3)客戶端與DN1建立連線,然後將blockId、DN2、DN3等相關資料先發送給DN1DN1接收到這個資訊之後與DN2建立連線,然後將blockID、DN3等相關資料傳送給DN2DN2接收到這個資料之後與DN3建立連線,然後將blockID傳送給DN3客戶端讀取本地檔案內容並放入記憶體緩衝區中,當緩衝區滿,開始將緩衝區中的資料取出,並計算校驗和(每512位元組的實際資料會計算出一個4位元組的校驗和,這512位元組的資料和校驗和稱為一個chunk),然後這個chunk寫入到一個dataPacket中,當dataPacket中chunk的數量或實際資料大小達到一定閾值後將這個dataPacket傳送給DN1,並將這個dataPacket放入到一個ackQueue佇列中(當客戶端接收到DN1的確認寫入的資訊之後才將這個dataPacket從佇列中移除)DN1接收到客戶端傳送的資料之後,將dataPacket中的資料和校驗和寫入本地檔案中,然後將dataPacket傳送給DN2DN2接收到DN1傳送的資料之後,將dataPacket中的資料和校驗和寫入本地檔案中,然後dataPacket傳送給DN3DN3接收到DN2傳送的資料之後,將dataPacket中的資料和校驗和寫入本地檔案中,然後傳送確認資訊給DN2DN2接收到DN3的確認訊息之後將DN2自己的確認資訊和DN3的確認資訊傳送給DN1DN1接收到DN2發來的確認資訊後(包含DN2和DN3的確認資訊),將DN1自己的確認資訊和DN2、DN3的確認資訊一起響應給客戶端客戶端接收到資訊之後對DN1、DN2、DN3的確認資訊進行驗證,驗證成功,則將ackQueue中的dataPacket移除客戶端繼續執行同樣的操作,直到傳送出的真實資料量達到blockSize大小,此時一個block的寫入完畢注意當客戶端傳送資料的位元組數量達到一個blockSize之後,會向NameNode重新請求一個新的blockId及相關的DataNode資訊哦下面以流程圖的方式加深資料寫入DataNode過程的理解
圖示(以一個packet寫入為例)一個packet寫入流程
線上求關注
最新評論