HDFS數據存儲和刪除

轉載:https://blog.csdn.net/oh_mourinho/article/details/53117691node

1、數據寫入

在客戶端想HDFS寫數據的過程當中,主要分爲下面幾個過程:緩存

客戶端將數據緩存到本地的一個臨時文件中;
當這個本地的臨時文件到達HDFS中的塊大小限制時,客戶端訪問Namenode,Namenode將文件的名字插入到HDFS命名空間中,而且爲其分配相應的存儲位置;
Namenode與分配好的Datanode進行溝通,肯定存儲位置可用,而後將這些存儲位置信息返回給客戶端;
客戶端將本地的臨時文件傳輸到Datanode中;
當寫文件結束,臨時文件關閉時,會將已有的臨時數據傳輸到Datanode中,並告知Namenode寫數據完成;
Namenode將該文件改變爲持久的一致性狀態,也就事將該操做記錄到日誌EditLog中。若是此時Namenode宕掉,那麼文件信息丟失。網絡

上面的過程主要特色是寫入數據先緩存到本地,在達到塊大小限制時才與Datanode通訊進行傳輸。這樣的好處在於避免在客戶寫數據的過程當中持續佔用網絡帶寬,這對於處理多用戶大量數據的寫入是很是關鍵的。oop

2、數據備份

數據的寫入同時伴隨這數據塊的備份,過程以下:學習

在客戶端臨時數據達到一個塊時,與Namenode通訊,獲得一組Datanode地址,這些Datanode就是用來存儲該數據塊的;
客戶端首先將該數據塊發送到一個Datanode上,Datanode在接受時是以4kb爲單位進行,咱們把這些小單位稱爲緩存頁(參考了Linux管道文件的說法);
對於第一個接到數據的Datanode,它把緩存頁中的數據寫入本身的文件系統,另外一方面,它又將這些緩存頁傳送給下一個Datanode;
重複3的過程,第二個Datanode又將緩存頁存儲在本地文件系統,同時將它傳送給第三個Datanode;
若是HDFS中的備份數目設置爲3,那麼第三個Datanode就只須要將緩存頁存儲便可。.net

上面的過程當中,數據塊從客戶端流向第一個Datanode,而後再流向第二個,從第二個再到第三個,整個是一個流水線過程,中間不會有停頓。因此HDFS將它稱爲Replication Pipelining。日誌

爲何不採起客戶端同時向多個Datanode寫數據的方法呢?其實從Pipelining這個稱呼上就能夠猜到,客戶端和Datanode採用的緩存文件都是管道文件,即只支持一次讀取。blog

3、 數據刪除

HDFS中的數據刪除也是比較有特色的,並非直接刪除,而是先放在一個相似回收站的地方(/trash),可供恢復。ip

對於用戶或者應用程序想要刪除的文件,HDFS會將它重命名並移動到/trash中,當過了必定的生命期限之後,HDFS纔會將它從文件系統中刪除,並由Namenode修改相關的元數據信息。而且只有到這個時候,Datanode上相關的磁盤空間才能節省出來,也就是說,當用戶要求刪除某個文件之後,並不能立刻看出HDFS存儲空間的增長,得等到必定的時間週期之後(如今默認爲6小時)。文檔

對於備份數據,有時候也會須要刪除,好比用戶根據須要下調了Replicaion的個數,那麼多餘的數據備份就會在下次Beatheart聯繫中完成刪除,對於接受到刪除操做的Datanode來講,它要刪除的備份塊也是先放入/trash中,而後過必定時間後才刪除。所以在磁盤空間的查看上,也會有必定的延時。

那麼如何當即完全刪除文件呢,能夠利用HDFS提供的Shell命令:bin/Hadoop dfs expunge清空/trash。

關於HDFS打開、讀取、寫入文件的操做,覺先博文 Hadoop學習總結之二:HDFS讀寫過程解析 給出了很好的說明,可供參考。

上面寫的內容,基本上是來自HDFS官方文檔,而後稍微加上一些本身的見解,不少地方也沒有從Hadoop源碼中去求證。若是有不對的地方,還請高手指正,不勝感激!

相關文章
相關標籤/搜索