檔案的删除和恢複
和linux系統的資源回收筒設計一樣,hdfs會為每一個使用者建立一個資源回收筒目錄:/user/使用者名/.trash/,每一個被使用者通過shell删除的檔案/目錄,在系統資源回收筒中都一個周期,也就是當系統資源回收筒中的檔案/目錄在一段時間之後沒有被使用者回複的話,hdfs就會自動的把這個檔案/目錄徹底删除,之後,使用者就永遠也找不回這個檔案/目錄了。在hdfs内部的具體實作就是在namenode中開啟了一個背景線程emptier,這個線程專門管理和監控系統資源回收筒下面的所有檔案/目錄,對于已經超過生命周期的檔案/目錄,這個線程就會自動的删除它們,不過這個管理的粒度很大。另外,使用者也可以手動清空資源回收筒,清空資源回收筒的操作和删除普通的檔案目錄是一樣的,隻不過hdfs會自動檢測這個檔案目錄是不是資源回收筒,如果是,hdfs當然不會再把它放入使用者的資源回收筒中了
根據上面的介紹,使用者通過指令行即hdfs的shell指令删除某個檔案,這個檔案并沒有立刻從hdfs中删除。相反,hdfs将這個檔案重命名,并轉移到操作使用者的資源回收筒目錄中(如/user/hdfs/.trash/current, 其中hdfs是操作的使用者名)。如果使用者的資源回收筒中已經存在了使用者目前删除的檔案/目錄,則hdfs會将這個目前被删除的檔案/目錄重命名,命名規則很簡單就是在這個被删除的檔案/目錄名後面緊跟一個編号(從1開始知道沒有重名為止)。
當檔案還在/user/hdfs/.trash/current目錄時,該檔案可以被迅速地恢複。檔案在/user/hdfs/.trash/current中儲存的時間是可配置的,當超過這個時間,namenode就會将該檔案從namespace中删除。 檔案的删除,也将釋放關聯該檔案的資料塊。注意到,在檔案被使用者删除和hdfs空閑的增加之間會有一個等待時間延遲。
當被删除的檔案還保留在/user/hdfs/.trash/current目錄中的時候,如果使用者想恢複這個檔案,可以檢索浏覽/user/hdfs/.trash/current目錄并檢索該檔案。/user/hdfs/.trash/current目錄僅僅儲存被删除 檔案的最近一次拷貝。/user/dfs/.trash/current目錄與其他檔案目錄沒有什麼不同,除了一點:hdfs在該目錄上應用了一個特殊的政策來自動删除檔案,目前的預設政策是 删除保留超過6小時的檔案,這個政策以後會定義成可配置的接口。
還有,namenode是通過背景線程(預設是org.apache.hadoop.fs.trashpolicydefault.emptier,也可以通過fs.trash.classname指定trashpolicy類)來定時清空所有使用者資源回收筒中的檔案/目錄的,它每隔interval分鐘就清空一次使用者資源回收筒。具體的操作步驟是,先檢查使用者資源回收筒目錄/user/使用者名/.trash下的所有yymmddhhmm形式的目錄,然後删除壽命超過interval的目錄,最後将目前存放删除的檔案/目錄的資源回收筒目錄/user/使用者名/.trash/current重命名為一個/user/使用者名/.trash/yymmddhhmm.
從這個回收線程(emptier)的實作可以看出,被使用者用指令删除的檔案最多可在其資源回收筒中儲存2*interval分鐘,最少可儲存interval分鐘,過了這個有效期,使用者删除的檔案就永遠也不可能恢複了
配置
在每個節點(不僅僅是主節點)上添加配置 /etc/hadoop/conf/core-site.xml,增加如下内容
注意:當使用者寫程式調用hdfs的api時,namenode并不會把删除的檔案或目錄放入資源回收筒trash中,而是需要自己實作相關的資源回收筒邏輯,見如下的代碼
執行程式後,發現使用程式删除的檔案,也到了使用者的資源回收筒目錄中,見紅框内