Hadoop Trash回收站使用指南


轉載:https://blog.csdn.net/sunnyyoona/article/details/78869778

我們在刪除一個文件時,遇到如下問題,提示我們不能刪除文件放回回收站:

sudo -uxiaosi hadoop fs -rm -r tmp/data_group/test/employee/employee_salary.txt
17/12/06 16:34:48 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 72000000 minutes, Emptier interval = 0 minutes.
17/12/06 16:34:48 WARN fs.TrashPolicyDefault: Can't create trash directory: hdfs://cluster/user/xiaosi/.Trash/Current/user/xiaosi/tmp/data_group/test/employee
rm: Failed to move to trash: hdfs://cluster/user/xiaosi/tmp/data_group/test/employee/employee_salary.txt. Consider using -skipTrash option

 

去回收站對應目錄下觀察一下,得出的結論是:無法創建目錄employee,因為employee文件已經存在,自然導致employee_salary.txt文件不能放回收回站:

-rw-r--r--   3 xiaosi xiaosi  352 2017-12-06 16:18 hdfs://cluster/user/xiaosi/.Trash/Current/user/xiaosi/tmp/data_group/test/employee

 

跟如下是同樣的道理:

xiaosi@yoona:~$ ll employee
-rw-rw-r-- 1 xiaosi xiaosi 0 12月 6 16:56 employee
xiaosi@yoona:~$
xiaosi@yoona:~$
xiaosi@yoona:~$ mkdir employee
mkdir: 無法創建目錄"employee": 文件已存在

 

借此機會,詳細研究了一下HDFSTrash回收站機制。

1. 配置

HDFS的回收站就像Windows操作系統中的回收站一樣。它的目的是防止你無意中刪除某些東西。你可以通過設置如下屬性來啟用此功能(默認是不開啟的):

<property>  
<name>fs.trash.interval</name>
<value>1440</value>
<description>Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled.</description>
</property>

<property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
<description>Number of minutes between trash checkpoints. Should be smaller or equal to fs.trash.interval. If zero, the value is set to the value of fs.trash.interval.</description>
</property>

 

屬性 說明
fs.trash.interval 分鍾數,當超過這個分鍾數后檢查點會被刪除。如果為零,回收站功能將被禁用。
fs.trash.checkpoint.interval 檢查點創建的時間間隔(單位為分鍾)。其值應該小於或等於fs.trash.interval。如果為零,則將該值設置為fs.trash.interval的值。

2. Trash

啟用回收站功能后,使用rm命令從HDFS中刪除某些內容時,文件或目錄不會立即被清除,它們將被移動到回收站Current目錄中(/user/${username}/.Trash/current)。如果檢查點已經啟用,會定期使用時間戳重命名Current目錄。.Trash中的文件在用戶可配置的時間延遲后被永久刪除。回收站中的文件和目錄可以簡單地通過將它們移動到.Trash目錄之外的位置來恢復:

sudo -uxiaosi hadoop fs -rm tmp/data_group/test/employee/employee_salary.txt
17/12/06 17:24:32 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 72000000 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://cluster/user/xiaosi/tmp/data_group/test/employee/employee_salary.txt' to trash at: hdfs://cluster/user/xiaosi/.Trash/Current

 

說明:

  • Deletion interval表示檢查點刪除時間間隔(單位為分鍾)。這里是fs.trash.interval的值。NameNode運行一個線程來定期從文件系統中刪除過期的檢查點。
  • Emptier interval表示在運行線程來管理檢查點之前,NameNode需要等待多長時間(以分鍾為單位),即檢查點創建時間間隔。NameNode刪除超過fs.trash.interval的檢查點,並為/user/${username}/.Trash/Current創建一個新的檢查點。該頻率由fs.trash.checkpoint.interval的值確定,且不得大於Deletion interval。這確保了在emptier窗口內回收站中有一個或多個檢查點。

例如,可以設置如下:

fs.trash.interval = 360 (deletion interval = 6 hours)
fs.trash.checkpoint.interval = 60 (emptier interval = 1 hour)

 

這導致NameNodeCurrent目錄下的垃圾文件每小時創建一個新的檢查點,並刪除已經存在超過6個小時的檢查點。

在回收站生命周期結束后,NameNodeHDFS命名空間中刪除該文件。刪除文件會導致與文件關聯的塊被釋放。請注意,用戶刪除文件的時間與HDFS中相應增加可用空間的時間之間可能存在明顯的時間延遲,即用戶刪除文件,HDFS可用空間不會立馬增加,中間有一定的延遲。

3. 檢查點

檢查點僅僅是用戶回收站下的一個目錄,用於存儲在創建檢查點之前刪除的所有文件或目錄。如果你想查看回收站目錄,可以在/user/${username}/.Trash/{timestamp_of_checkpoint_creation}處看到:

hadoop fs -ls hdfs://cluster/user/xiaosi/.Trash/
Found 3 items
drwx------ - xiaosi xiaosi 0 2017-12-05 08:00 hdfs://cluster/user/xiaosi/.Trash/171205200038
drwx------ - xiaosi xiaosi 0 2017-12-06 01:00 hdfs://cluster/user/xiaosi/.Trash/171206080038
drwx------ - xiaosi xiaosi 0 2017-12-06 08:00 hdfs://cluster/user/xiaosi/.Trash/Current

 

最近刪除的文件被移動到回收站Current目錄,並且在可配置的時間間隔內,HDFS會為在Current回收站目錄下的文件創建檢查點/user/${username}/.Trash/<日期>,並在過期時刪除舊的檢查點。

4. 清空回收站

首先想到的是只要刪除整個回收站目錄,將會清空回收站。誠然,這是一個選擇。但是我們有更好的選擇。HDFS提供了一個命令行工具來完成這個工作:

hadoop fs -expunge

 

該命令使NameNode永久刪除回收站中比閾值更早的文件,而不是等待下一個emptier窗口。它立即從文件系統中刪除過期的檢查點。

5. 注意點

回收站功能默認是禁用的。對於生產環境,建議啟用回收站功能以避免意外的刪除操作。啟用回收站提供了從用戶操作刪除或用戶意外刪除中恢復數據的機會。但是為fs.trash.intervalfs.trash.checkpoint.interval設置合適的值也是非常重要的,以使垃圾回收以你期望的方式運作。例如,如果你需要經常從HDFS上傳和刪除文件,則可能需要將fs.trash.interval設置為較小的值,否則檢查點將占用太多空間。

當啟用垃圾回收並刪除一些文件時,HDFS容量不會增加,因為文件並未真正刪除。HDFS不會回收空間,除非文件從回收站中刪除,只有在檢查點過期后才會發生。

回收站功能默認只適用於使用Hadoop shell刪除的文件和目錄。使用其他接口(例如WebHDFSJava API)以編程的方式刪除的文件或目錄不會移動到回收站,即使已啟用回收站,除非程序已經實現了對回收站功能的調用。

有時你可能想要在刪除文件時臨時禁用回收站,也就是刪除的文件或目錄不用放在回收站而直接刪除,在這種情況下,可以使用-skipTrash選項運行rm命令。例如:

sudo -uxiaosi hadoop fs -rm -skipTrash tmp/data_group/test/employee/employee_salary.txt

 

這會繞過垃圾回收站並立即從文件系統中刪除文件。

資料:

https://developer.ibm.com/hadoop/2015/10/22/hdfs-trash/

https://my.oschina.net/cloudcoder/blog/179381

http://debugo.com/hdfs-trash/

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#File_Deletes_and_Undeletes

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM