HDFS - 寫數據的那些事

以前也提過,客戶端須要寫數據的時候,就會跟NameNode說他準備把文件上傳到某個目錄,NameNode就會開始進行元數據的更新。因爲元數據的更新是很是重要的,因此客戶端會在必定條件內重試,直至成功。
image.png
元數據更新成功後,Client就會建立兩個隊列,一個是dataQueue,一個是ackQueue。這兩個隊列的做用下文會講。
image.png
客戶端寫入的時候,是一個個chunk寫的,每個chunk的大小是512byte,chunk的校驗和chunksum是4byte,這個校驗和是對塊的內容進行校驗用的,因此每寫入一個chunk的大小就是516byte。
image.png
這些chunk寫滿後,就會存放在一個叫作packet的東東里面,這個packet有64k的大小,因此就是65535byte,至關於127個chunk。每次寫滿一個packet或者寫滿128M(就是block的大小),就會建立一個新的packet給chunk寫入。
image.png
已經寫滿的packet,就是放在上面提到的dataQueue。
image.png
客戶端有其餘線程,會監控dataQueue,此時他發現了dataQueue有數據了,他就開始向NameNode申請block信息。
NameNode會根據負載均衡以及機架感知,把計算後的DataNode的信息給到客戶端。
image.png
獲得DataNode信息後的客戶端,就開始與其中一個DataNode創建數據管道,這個DataNode又會與其餘DataNode創建數據管道。
image.png
創建數據管道的做用,就是把經過socket把數據傳過去,客戶端這裏並無直接和三個DataNode創建數據管道,這是由於DataNode通常是同一個機房的,因此他們內部通信的速度會比較快。
管道創建成功後,客戶端就會把dataQueue隊列的頭部packet拿出來,經過socket傳給DataNode,另外也會把packet放入到ackQueue。
image.png
放入ackQueue的緣由是爲了防止packet傳輸給DataNode失敗,若是失敗了,就會把packet隊列的packet放回到dataQueue,這樣監聽dataQueue隊列的線程就會從新把她拿出來進行傳輸。若是傳輸成功了,會把ackQueue的packet移除。
DataNode接收到數據後,會把數據寫入ackQueue隊列,而後再把packet傳輸給下游,最後才寫入磁盤。
image.png
這個ackQueue隊列的做用跟上面同樣,是爲了防止傳輸失敗,若是傳輸成功,就會把ackQueue隊列中的packet移除,若是失敗,就會繼續傳輸。
若是DataNode不是最後一個節點,那就會重複上面的操做。負載均衡

相關文章
相關標籤/搜索