轉載:https://blog.csdn.net/sunnyyoona/article/details/78869778
我們在刪除一個文件時,遇到如下問題,提示我們不能刪除文件放回回收站:
sudo -uxiaosi hadoop fs -rm -r tmp/data_group/test/employee/employee_salary.txt |
去回收站對應目錄下觀察一下,得出的結論是:無法創建目錄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 |
借此機會,詳細研究了一下HDFS
的Trash
回收站機制。
1. 配置
HDFS
的回收站就像Windows
操作系統中的回收站一樣。它的目的是防止你無意中刪除某些東西。你可以通過設置如下屬性來啟用此功能(默認是不開啟的):
<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 |
說明:
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) |
這導致NameNode
為Current
目錄下的垃圾文件每小時創建一個新的檢查點,並刪除已經存在超過6個小時的檢查點。
在回收站生命周期結束后,NameNode
從HDFS
命名空間中刪除該文件。刪除文件會導致與文件關聯的塊被釋放。請注意,用戶刪除文件的時間與HDFS中相應增加可用空間的時間之間可能存在明顯的時間延遲,即用戶刪除文件,HDFS可用空間不會立馬增加,中間有一定的延遲。
3. 檢查點
檢查點僅僅是用戶回收站下的一個目錄,用於存儲在創建檢查點之前刪除的所有文件或目錄。如果你想查看回收站目錄,可以在/user/${username}/.Trash/{timestamp_of_checkpoint_creation}
處看到:
hadoop fs -ls hdfs://cluster/user/xiaosi/.Trash/ |
最近刪除的文件被移動到回收站Current
目錄,並且在可配置的時間間隔內,HDFS
會為在Current
回收站目錄下的文件創建檢查點/user/${username}/.Trash/<日期>
,並在過期時刪除舊的檢查點。
4. 清空回收站
首先想到的是只要刪除整個回收站目錄,將會清空回收站。誠然,這是一個選擇。但是我們有更好的選擇。HDFS
提供了一個命令行工具來完成這個工作:
hadoop fs -expunge |
該命令使NameNode
永久刪除回收站中比閾值更早的文件,而不是等待下一個emptier
窗口。它立即從文件系統中刪除過期的檢查點。
5. 注意點
回收站功能默認是禁用的。對於生產環境,建議啟用回收站功能以避免意外的刪除操作。啟用回收站提供了從用戶操作刪除或用戶意外刪除中恢復數據的機會。但是為fs.trash.interval
和fs.trash.checkpoint.interval
設置合適的值也是非常重要的,以使垃圾回收以你期望的方式運作。例如,如果你需要經常從HDFS
上傳和刪除文件,則可能需要將fs.trash.interval
設置為較小的值,否則檢查點將占用太多空間。
當啟用垃圾回收並刪除一些文件時,HDFS
容量不會增加,因為文件並未真正刪除。HDFS
不會回收空間,除非文件從回收站中刪除,只有在檢查點過期后才會發生。
回收站功能默認只適用於使用Hadoop shell
刪除的文件和目錄。使用其他接口(例如WebHDFS
或Java 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