fs.trash.interval 이 0 보다 크면 hdfs dfs -rm 으로 지운 파일이 곧바로 사라지지 않고 사용자별 휴지통으로 이동한다. 값의 단위는 분이다. 0 이면 휴지통을 쓰지 않고 즉시 삭제한다.
hdfs getconf -confKey fs.trash.interval
hdfs getconf -confKey fs.trash.checkpoint.interval
경로는 /user/<username>/.Trash/ 이며, 방금 지운 것은 Current 아래에, 체크포인트가 돌면 시각 이름의 디렉터리로 옮겨진다. 보존 시간이 지난 체크포인트는 NameNode 의 TrashEmptier 스레드가 지운다.
휴지통 안에는 삭제 당시의 전체 경로 구조가 그대로 들어 있다. 원래 위치를 찾아 옮기면 복구된다.
hdfs dfs -ls /user/$USER/.Trash/Current/
hdfs dfs -ls -R /user/$USER/.Trash/Current/user/hive/warehouse | head
hdfs dfs -mv /user/$USER/.Trash/Current/user/hive/warehouse/mytable /user/hive/warehouse/
다른 사용자가 지운 파일을 복구하려면 superuser 권한이 필요하다. 휴지통은 사용자 홈 아래에 있어 소유자만 접근할 수 있기 때문이다.
sudo -u hdfs hdfs dfs -ls /user/otheruser/.Trash/Current/
복구 후 소유자와 권한이 바뀌었을 수 있으므로 확인한다. Hive/Impala 테이블 디렉터리를 되돌렸다면 메타데이터를 갱신한다.
hdfs dfs -chown -R hive:hive /user/hive/warehouse/mytable
INVALIDATE METADATA mydb.mytable;
hdfs dfs -expunge
sudo -u hdfs hdfs dfs -expunge
-expunge 는 명령을 실행한 사용자의 휴지통만 처리한다. 클러스터 전체를 한 번에 비우는 명령이 아니다. 각 사용자별로 실행하거나, 경로를 직접 지우는 방식으로 정리한다.
-expunge 는 보존 시간이 지난 체크포인트를 삭제하고 현재 휴지통에 새 체크포인트를 만든다. 즉 방금 지운 파일이 그 즉시 영구 삭제되지는 않는다. 용량을 당장 회수해야 한다면 경로를 직접 지운다.
sudo -u hdfs hdfs dfs -rm -r -skipTrash /user/someuser/.Trash
hdfs dfs -rm -skipTrash /path/to/file
hdfs dfs -rm -r -skipTrash /path/to/directory
되돌릴 수 없다. 운영 환경에서 배치 스크립트에 습관적으로 넣는 것을 피한다.
휴지통에 있는 파일도 HDFS 용량을 차지한다. 보존 시간을 길게 잡아 두면 삭제해도 용량이 회수되지 않는다. 일반적으로 하루에서 이레 사이로 잡고 사용량을 모니터링한다.
Hive 나 Impala 의 DROP TABLE ... PURGE 는 휴지통을 건너뛴다. 되돌릴 수 없으므로 운영 테이블에는 쓰지 않는다.
-skipTrash 사용 자체를 막는 HDFS 설정은 없다. 감사 로그에서 탐지하거나, 삭제 권한을 Ranger 정책으로 제한하거나, 명령 래퍼로 거르는 방식으로 다룬다.