block :檔案上傳前需要分塊,這個塊就是block,一般為128mb,可以修改。因為塊太小:定址時間佔比過高。塊太大:map任務數太少,作業執行速度變慢。它是最大的乙個單位。
packet :packet是第二大的單位,它是client端向datanode,或datanode的pipline之間傳資料的基本單位,預設64kb。
chunk :chunk是最小的單位,它是client向datanode,或datanode的pipline之間進行資料校驗的基本單位,預設512byte,因為用作校驗,故每個chunk需要帶有4byte的校驗位。所以實際每個chunk寫入packet的大小為516byte。由此可見真實資料與校驗值資料的比值 約為128 : 1。(即64*1024 / 512)
讀詳細步驟:
1、client跟namenode通訊,查詢元資料資訊,找到檔案塊所在的datanode伺服器。
2、就近挑選一台datanode(就近原則,然後隨機)伺服器,請求建立輸入流 。
3、datanode開始傳送資料,即從磁碟裡面讀取資料放入流,以packet為單位來校驗。
4、客戶端以packet為單位接收,現在本地快取,然後寫入目標檔案。
5、關閉輸入流。
寫詳細步驟:
1、客戶端向namenode發出寫檔案請求。
2、檢查是否已存在檔案、檢查許可權。若通過檢查,直接先將操作寫入editlog,並返回輸出流物件。(注:wal,write ahead log,先寫log,再寫記憶體,因為editlog記錄的是最新的hdfs客戶端執行所有的寫操作。如果後續真實寫操作失敗了,editlog中仍會有記錄)
3、namenode返回
是否可以上傳。
4、client請求第乙個 block(128mb的塊切檔案)該傳輸到哪些datanode伺服器上。
5、namenode返回n個datanode伺服器,如abc。
6、client請求最近的第乙個datanodea節點,此後client端和多個datanode(b、c)構成pipeline管道。
7、client向第乙個datanodea寫入乙個packet,這個packet便會在pipeline裡傳給第二個、第三個…datanode(b、c)。在pipeline反方向上,逐個傳送ack(命令正確應答),最終由pipeline中第乙個datanode節點將ack傳送給client。
8、當乙個block傳輸完成之後,client再次請求namenode上傳第二個block的伺服器。
9、寫完資料,關閉輸輸出流.
10、傳送完成訊號給namenode。
更通俗易懂的圖:
client寫資料時,會將位元組流資料快取到內部的緩衝區中,當長度滿足乙個chunk大小(512b)時,便會建立乙個packet物件,然後向該packet物件中寫chunk
的checksum校驗和資料,以及實際資料塊chunk data,校驗和資料是基於實際資料塊計算得到的。每次滿足乙個chunk大小時,都會向packet中寫上述資料內容,
直到達到乙個packet物件大小(64k),就會將該packet物件放入到dataqueue佇列中,等待datastreamer執行緒取出併發送到datanode節點。
datastreamer執行緒從dataqueue佇列中取出packet物件,放到ackqueue佇列中,然後向datanode節點傳送這個packet物件所對應的資料
傳送乙個packet資料報以後,會有乙個用來接收ack的responseprocessor執行緒,如果收到成功的ack,則表示乙個packet傳送成功,responseprocessor執行緒會將
ackqueue佇列中對應的packet刪除,在傳送過程中,如果發生錯誤,所有未完成的packet都會從ackqueue佇列中移除掉,然後重新建立乙個新的pipeline,排除掉出錯的
那些datanode節點,接著datastreamer執行緒繼續從dataqueue佇列中傳送packet。
參考:
HDFS讀寫資料過程
一 檔案的開啟 1.1 客戶端 hdfs開啟乙個檔案,需要在客戶端呼叫distributedfilesystem.open path f,int buffersize 其實現為 public fsdatainputstream open path f,int buffersize throws io...
HDFS讀寫過程
讀過程 1 初始化filesystem,然後客戶端 client 用filesystem的open 函式開啟檔案 2 filesystem用rpc呼叫元資料節點,得到檔案的資料塊資訊,對於每乙個資料塊,元資料節點返回儲存資料塊的資料節點的位址。3 filesystem返回fsdatainputstr...
hdfs的讀寫過程
詳細步驟解析 1 client發起檔案上傳請求,通過rpc與namenode建立通訊,namenode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳 client呼叫filesystem.create filepath 方法,去與nn進行 rpc 通訊,check該路徑的檔案是否存在以及有...