HDFS寫資料流程
HDFS中的檔案在物理上是分塊儲存(Block),塊的大小可以通過配置引數(dfs.blocksize)來規定,預設大小,2.X/3.X版本中是128M,1.X版本中是64M。128M指的是上限。
(1) 客戶端發起檔案上傳請求,通過RPC(遠端過程呼叫)與NameNode建立通訊。
(2) NameNode檢查元資料檔案的系統目錄樹。
(3) 若系統目錄樹的父目錄不存在該檔案相關資訊,返回客戶端可以上傳檔案。
(4) 客戶端請求上傳第一個Block資料塊,以及資料塊副本的數量(可以自定義副本數量,也可以使用叢集規劃的副本數量)。
(5) NameNode檢測元資料檔案中DataNode資訊池,找到可用的資料節點(DataNode_01,DataNode_02,DataNode_03)。
(6) 將可用的資料節點的IP地址返回給客戶端。
(7) 客戶端請求3臺節點中的一臺伺服器DataNode_01,進行傳送資料(本質上是一個RPC呼叫,建立管道Pipeline),DataNode_01收到請求會繼續呼叫伺服器DataNode_02,然後伺服器DataNode_02呼叫伺服器DataNode_03。
(8) DataNode之間建立Pipeline後,逐個返回建立完畢資訊。
(9) 客戶端與DataNode建立資料傳輸流,開始傳送資料包(資料是以資料包形式進行傳送)。
(10) 客戶端向DataNode_01上傳第一個Block資料塊,是以Packet為單位(預設64K),傳送資料塊。當DataNode_01收到一個Packet就會傳給DataNode_02,DataNode_02傳給DataNode_03; DataNode_01每傳送一個Packet都會放入一個應答佇列等待應答。
(11) 資料被分割成一個個Packet資料包在Pipeline上依次傳輸,而在Pipeline反方向上,將逐個傳送Ack(命令正確應答),最終由Pipeline中第一個DataNode節點DataNode_01將Pipeline的 Ack資訊傳送給客戶端。
(12) DataNode返回給客戶端,第一個Block塊傳輸完成。客戶端則會再次請求NameNode上傳第二個Block塊和第三塊到伺服器上,重複上面的步驟,直到3個Block都上傳完畢。