Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する
誤って消したファイルをゴミ箱とスナップショットから復元する
한국어 원문으로 표시합니다.
목표
주문 폴더에 스냅샷을 허용하고 찍은 뒤, 셸의 rm 으로 지운 파일은 휴지통에서, -skipTrash 로 지운 파일은 스냅샷에서 되살린다. 파일을 고친 뒤 두 스냅샷의 차이를 보고, 스냅샷이 있는 디렉터리가 통째로 지워지지 않는 것과 스냅샷 이름을 바꾸는 것까지 해 본다.
왜 중요한가
지운 파일을 되살리는 길은 둘이고 성격이 다르다. 휴지통은 클라이언트(셸) 가 하는 일이다 — hdfs dfs -rm 이 파일을 지우는 대신 사용자 홈의 .Trash/Current 로 옮긴다. 그래서 -skipTrash 를 주거나, 셸이 아닌 프로그램(Spark·API)이 지우면 휴지통을 거치지 않는다.
스냅샷은 NameNode 가 하는 일이다. 스냅샷을 찍는 순간의 디렉터리 트리를 메타데이터로 기억하고, 그 뒤에 무엇이 지워지거나 바뀌어도 스냅샷 쪽 블록은 지우지 않는다. 데이터를 복사하지 않으므로 찍는 것은 즉시 끝나고, 대신 스냅샷이 붙잡고 있는 블록만큼 공간이 반환되지 않는다.
운영에서는 둘을 함께 쓴다. 휴지통은 사람의 실수를, 스냅샷은 잡의 실수(잘못된 overwrite, 지운 파티션)를 되돌린다. 차이 보고(snapshotDiff)는 '어제부터 무엇이 바뀌었나' 를 답하고, distcp 의 증분 복사도 이것을 쓴다.
단계
- /snap/orders 에
a.csv(=/data/finance/q1.csv)·b.csv(=q2.csv)·c.csv(=/data/small/sensor-0000.csv)를 올리고 스냅샷을 허용하세요(hdfs dfsadmin -allowSnapshot). - 스냅샷 s1 을 찍으세요(
hdfs dfs -createSnapshot /snap/orders s1). hdfs dfs -rm /snap/orders/a.csv로 a.csv 를 지우세요(휴지통으로 갑니다).hdfs dfs -rm -skipTrash /snap/orders/b.csv로 b.csv 를 지운 뒤, /snap/orders/.snapshot/s1/b.csv 에서 복사해 되살리세요.- c.csv 끝에 줄 하나를 덧붙이고(
-appendToFile), 스냅샷 s2 를 찍은 뒤hdfs snapshotDiff /snap/orders s1 s2출력을 /root/hdp/snap/diff.txt 에 저장하세요. hdfs dfs -rm -r -skipTrash /snap/orders를 해 보고 오류 출력을 /root/hdp/snap/deny.txt 에 저장하세요.- 스냅샷 s2 의 이름을 before-audit 로 바꾸세요(
hdfs dfs -renameSnapshot). - /root/hdp/snap/report.md 에
## 휴지통## 스냅샷## 지킬 것세 절을 쓰세요. 둘째 절에 5단계 차이 보고의 줄 수(머리줄 제외)를 넣으세요.
참고
- 이 이미지의 휴지통 보관 시간은 하루(
fs.trash.interval=1440분)입니다. 기본값 0 이면 휴지통이 꺼져 있어rm이 곧바로 지웁니다. - 휴지통의 파일은
/user/<사용자>/.Trash/Current/<원래 경로>에 있습니다. 되살리기는hdfs dfs -mv로 제자리로 옮기면 됩니다. - 스냅샷은
<디렉터리>/.snapshot/<이름>/아래에서 읽기 전용으로 보입니다.-ls에는 나오지 않지만 경로로 직접 들어갈 수 있습니다. - 흔한 실수: 스냅샷을 허용하지 않은 디렉터리에 찍으려는 것,
-rm -r -skipTrash를 스냅샷이 막아 주리라 믿고 다른 디렉터리에 쓰는 것, 스냅샷에서mv하려는 것(읽기 전용 —cp로 되살립니다). - 공식 문서: HDFS Snapshots · HDFS Architecture — Space Reclamation · FileSystem Shell — rm · WebHDFS — Snapshot Operations
스냅샷을 허용하기
HDFS /snap/orders 를 만들어 /data/finance/q1.csv 를 a.csv, /data/finance/q2.csv 를 b.csv, /data/small/sensor-0000.csv 를 c.csv 로 올리고, hdfs dfsadmin -allowSnapshot /snap/orders 를 하세요.
스냅샷은 아무 디렉터리에서나 찍을 수 없습니다. 관리자가 '이 디렉터리는 스냅샷을 찍어도 된다' 고 허용한 디렉터리(snapshottable)에서만 됩니다. WebHDFS 의 GETFILESTATUS 에 snapshotEnabled 가 나타나는지 보세요.
스냅샷 s1 찍기
hdfs dfs -createSnapshot /snap/orders s1 으로 스냅샷 s1 을 찍으세요.
찍는 것은 즉시 끝납니다. 블록을 복사하지 않고 그 순간의 트리를 NameNode 가 기억할 뿐입니다. hdfs dfs -ls /snap/orders/.snapshot/s1 로 보세요.
rm 은 휴지통으로 옮긴다
hdfs dfs -rm /snap/orders/a.csv 로 a.csv 를 지우세요. 파일이 /user/root/.Trash/Current/snap/orders/a.csv 로 가 있어야 합니다.
셸의 rm 은 지우는 대신 옮깁니다. 출력의 'Moved: … to trash at …' 가 그 뜻입니다(로그 수준을 WARN 으로 두었다면 보이지 않습니다). 되살리려면 그 경로에서 mv 로 돌려놓으면 됩니다.
-skipTrash 로 지운 것은 스냅샷에서
hdfs dfs -rm -skipTrash /snap/orders/b.csv 로 b.csv 를 지운 뒤, hdfs dfs -cp /snap/orders/.snapshot/s1/b.csv /snap/orders/b.csv 로 되살리세요.
-skipTrash 는 휴지통을 건너뛰므로 휴지통에는 없습니다. 하지만 s1 이 그 파일의 블록을 붙잡고 있어 스냅샷 경로로 읽을 수 있습니다. 스냅샷은 읽기 전용이라 mv 가 아니라 cp 입니다.
두 스냅샷의 차이
echo 2026-03-01,s-9999,99.9 | hdfs dfs -appendToFile - /snap/orders/c.csv 처럼 c.csv 에 줄 하나를 덧붙이고, 스냅샷 s2 를 찍은 뒤 hdfs snapshotDiff /snap/orders s1 s2 출력을 /root/hdp/snap/diff.txt 에 저장하세요.
차이 보고의 기호는 M(고침) +(생김) -(사라짐) R(이름 바뀜)입니다. b.csv 가 '-' 와 '+' 로 두 번 나오는 이유를 생각해 보세요 — 되살린 것은 같은 이름의 새 파일입니다. 채점기는 WebHDFS 의 GETSNAPSHOTDIFF 와 여러분의 파일을 줄 단위로 견줍니다.
스냅샷이 디렉터리를 지킨다
hdfs dfs -rm -r -skipTrash /snap/orders 를 실행해 보고 오류 출력을 /root/hdp/snap/deny.txt 에 저장하세요. /snap/orders 는 그대로 남아야 합니다.
스냅샷이 하나라도 있는 snapshottable 디렉터리는 지울 수 없습니다. 디렉터리 삭제는 NameNode 에 보내는 요청 하나라서 통째로 거절되고, 안의 파일도 그대로 남습니다. 지우려면 스냅샷을 모두 지우고(-deleteSnapshot) 허용을 거둔 뒤에야 됩니다.
스냅샷 이름 바꾸기
hdfs dfs -renameSnapshot /snap/orders s2 before-audit 로 스냅샷 s2 의 이름을 before-audit 로 바꾸세요.
스냅샷 이름은 날짜나 사건으로 붙여 두면 나중에 찾기 쉽습니다. 이름을 바꿔도 내용과 차이 보고는 그대로입니다.
되살리는 두 길을 남기기
/root/hdp/snap/report.md 에 ## 휴지통 ## 스냅샷 ## 지킬 것 세 절을 쓰세요. 둘째 절에 5단계 차이 보고의 줄 수(첫 머리줄을 뺀 기호 줄의 수)를 넣으세요.
휴지통이 누구의 기능이고 언제 소용없는지, 스냅샷이 무엇을 기억하고 무엇을 붙잡는지, 이 폴더를 지키려면 무엇을 규칙으로 둘지를 적으세요.