hdfs中的資料都是分塊儲存的,預設塊大小為64m,這個值可以從hdfs配置檔案中更改dfs.blocksize。這樣分快處理的好處是可以增加讀取資料的吞吐量,因為可以同時從讀取檔案的不同分塊。
在客戶端想hdfs寫資料的過程中,主要分為下面幾個過程:
客戶端將資料快取到本地的乙個臨時檔案中;
當這個本地的臨時檔案到達hdfs中的塊大小限制時,客戶端訪問namenode,namenode將檔案的名字插入到hdfs命名空間中,並且為其分配相應的儲存位置;
namenode與分配好的datanode進行溝通,確定儲存位置可用,然後將這些儲存位置資訊返回給客戶端;
客戶端將本地的臨時檔案傳輸到datanode中;
當寫檔案結束,臨時檔案關閉時,會將已有的臨時資料傳輸到datanode中,並告知namenode寫資料完成;
namenode將該檔案改變為持久的一致性狀態,也就事將該操作記錄到日誌editlog中。如果此時namenode宕掉,那麼檔案資訊丟失。
上面的過程主要特點是寫入資料先快取到本地,在達到塊大小限制時才與datanode通訊進行傳輸。這樣的好處在於避免在客戶寫資料的過程中持續占用網路頻寬,這對於處理多使用者大量資料的寫入是非常關鍵的。
資料的寫入同時伴隨這資料塊的備份,過程如下:
在客戶端臨時資料達到乙個塊時,與namenode通訊,得到一組datanode位址,這些datanode就是用來儲存該資料塊的;
客戶端首先將該資料塊傳送到乙個datanode上,datanode在接受時是以4kb為單位進行,我們把這些小單位稱為快取頁(參考了linux管道檔案的說法);
對於第乙個接到資料的datanode,它把快取頁中的資料寫入自己的檔案系統,另一方面,它又將這些快取頁傳送給下乙個datanode;
重複3的過程,第二個datanode又將快取頁儲存在本地檔案系統,同時將它傳送給第三個datanode;
如果hdfs中的備份數目設定為3,那麼第三個datanode就只需要將快取頁儲存即可。
上面的過程中,資料塊從客戶端流向第乙個datanode,然後再流向第二個,從第二個再到第三個,整個是乙個流水線過程,中間不會有停頓。所以hdfs將它稱為replication pipelining。
為什麼不採取客戶端同時向多個datanode寫資料的方法呢?其實從pipelining這個稱呼上就可以猜到,客戶端和datanode採用的快取檔案都是管道檔案,即只支援一次讀取。
hdfs中的資料刪除也是比較有特點的,並不是直接刪除,而是先放在乙個類似**站的地方(/trash),可供恢復。
對於使用者或者應用程式想要刪除的檔案,hdfs會將它重新命名並移動到/trash中,當過了一定的生命期限以後,hdfs才會將它從檔案系統中刪除,並由namenode修改相關的元資料資訊。並且只有到這個時候,datanode上相關的磁碟空間才能節省出來,也就是說,當使用者要求刪除某個檔案以後,並不能馬上看出hdfs儲存空間的增加,得等到一定的時間週期以後(現在預設為6小時)。
對於備份資料,有時候也會需要刪除,比如使用者根據需要下調了replicaion的個數,那麼多餘的資料備份就會在下次beatheart聯絡中完成刪除,對於接受到刪除操作的datanode來說,它要刪除的備份塊也是先放入/trash中,然後過一定時間後才刪除。因此在磁碟空間的檢視上,也會有一定的延時。
關於hdfs開啟、讀取、寫入檔案的操作,覺先博文hadoop學習總結之二:hdfs讀寫過程解析 給出了很好的說明,可供參考。
上面寫的內容,基本上是來自hdfs官方文件,然後稍微加上一些自己的看法,很多地方也沒有從hadoop原始碼中去求證。如果有不對的地方,還請高手指正,不勝感激!
Hadoop學習 HDFS資料儲存和刪除
hdfs中的資料都是分塊儲存的,預設塊大小為64m,這個值可以從hdfs配置檔案中更改dfs.blocksize。這樣分快處理的好處是可以增加讀取資料的吞吐量,因為可以同時從讀取檔案的不同分塊。在客戶端想hdfs寫資料的過程中,主要分為下面幾個過程 客戶端將資料快取到本地的乙個臨時檔案中 當這個本地...
hdfs元資料儲存
namenode如何儲存元資料 1.nn對元資料的管理分為三部分,記憶體中完整的元資料,磁碟中接近完整的元資料映象檔案 fsimage 記錄元資料操作資訊的edits檔案 2.snn通過配置,定時請求nn,進行checkpoint 3.nn接受到checkpoint請求,會立即滾動正在寫的edits...
HDFS檔案儲存
理論上hdfs中儲存乙個檔案時會被分成多個block,這些block應該會存放在不同的節點中。例如我們hdfs中有乙個檔案hdfs dfs put flink 1.8.2 bin scala 2.11.tgz 這個檔案被分成了三個block,分別是block0 block1 block2 這三個bl...