0529-5.15.0-這次玩兒大了,找不回了

  • 2019 年 11 月 28 日
  • 筆記

溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。

Fayson的github: https://github.com/fayson/cdhproject

提示:程式碼塊部分可以左右滑動查看噢

1

文檔編寫目的

前兩天客戶問了一個問題,HDFS上刪除的數據還能不能恢復?碰到這個問題第一反應「在執行命令的這個用戶下垃圾回收站找到恢復不就的了?」,用戶刪除數據發現操作失誤的時間並不長也沒有超過垃圾回收站的清空時間,但是無論怎麼找也找不到被刪除的數據,這次真的玩兒大了。。。

經溝通發現用戶是在MapReduce作業裡面調用了HDFS的API進行刪除操作,那這個刪除與我們命令行使用hadoop fs -rmr刪除有什麼區別?

  • 內容概述

1.源碼分析

2.總結

  • 測試環境

1.CM和CDH版本為5.15.0

2

API與命令行操作驗證

Fayson在本地進行測試,通過調用HDFS的API介面進行delete操作,刪除的文件或目錄確實在HDFS上無法找回。

1.確認HDFS的Trash清理時間

2.測試目錄/tmp/kafka-data

3.查看Fayson用戶下.Trash內容

當前用戶的垃圾回收站沒有任何內容

4.通過HDFS的API介面調用delete刪除目錄

執行刪除操作,刪除/tmp/ kafka-data目錄

5.刪除成功後在fayson用戶的回收站下查看是否能找到刪除的目錄

無論是在操作用戶的回收站還是所有用戶目錄下均找不到被刪除的kafka-data目錄。

6.接下來再使用命令行進行操作,先將數據目錄put到/tmp目錄下

在命令行執行刪除操作

可以看到命令行操作,提示將/tmp/kafka-data目錄move到了操作用戶的.Trash/Current/tmp/kafka-data目錄下,因此可以在fayson用戶的垃圾回收站找到被刪除的數據。

3

源碼分析

於是Fayson又查看了下HDFS的源碼找到了命令行操作與直接調用HDFS API的區別,如下是兩種操作方式區別:

1.命令行調用刪除操作是通過hadoop-common工程下org.apache.hadoop.fs.shell.Delete類實現,在該類中有如下程式碼段

未指定skipTrash,調用Trash.moveToAppropriateTrash方法,該方法最終調用org.apache.hadoop.fs.TrashPolicyDefault.moveTrash方法

最終也就看到了命令行刪除操作列印的日誌「Moved:…」

2.通過HDFS API介面的話,直接調用的是org.apache.hadoop.fs.FileSytem類的delete方法。

通過上述程式碼分析可以看到,在命令行只有指定skipTrash才會直接調用FileSystem的delete方法,因此在程式碼中直接調用HDFS API是會直接跳過回收站將指定的文件或目錄刪除,以至於我們在回收站是找不到被刪除的文件或目錄。

4

總結

刪除數據需謹慎!!!

提示:程式碼塊部分可以左右滑動查看噢

為天地立心,為生民立命,為往聖繼絕學,為萬世開太平。 溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。