Apache Hadoop — Stand up and run HDFS and YARN in one pod
Open fsimage and edits and read the namespace
한국어 원문으로 표시합니다.
목표
NameNode 가 네임스페이스를 어떻게 디스크에 남기는지 — 한 시점의 스냅숏인 fsimage 와 그 뒤의 변경 기록인 edits — 를 직접 열어 본다. 안전 모드에서 쓰기가 거절되는 것을 보고, saveNamespace 로 새 fsimage 를 만들고, 오프라인 이미지 뷰어(oiv)와 편집 로그 뷰어(oev)로 내용을 읽는다.
왜 중요한가
NameNode 는 파일 트리 전체를 메모리에 들고 일한다. 메모리는 꺼지면 사라지므로 두 가지를 디스크에 남긴다. fsimage 는 어느 트랜잭션 번호(txid)까지의 네임스페이스 전체이고, edits 는 그 뒤에 일어난 변경(디렉터리 만들기, 파일 닫기, 이름 바꾸기 …)을 한 줄씩 적은 기록이다. NameNode 가 다시 뜰 때는 fsimage 를 읽고 그 뒤의 edits 를 다시 적용한다.
edits 가 길어지면 기동이 느려지므로 주기적으로 fsimage 에 합쳐야 한다(체크포인트). 운영에서는 보조 NameNode 나 대기 NameNode 가 하고, 이 실습에서는 관리자 명령 saveNamespace 로 직접 한다. 그 명령이 안전 모드를 요구하는 이유는 저장하는 동안 네임스페이스가 바뀌면 안 되기 때문이다.
안전 모드는 NameNode 가 읽기만 받는 상태다. 기동 직후 DataNode 들의 블록 보고가 충분히 모일 때까지 자동으로 들어가고, 관리자가 작업을 위해 손으로 넣기도 한다. "쓰기가 전부 실패한다" 는 장애의 흔한 원인이다.
fsimage 를 오프라인으로 읽을 줄 알면, 살아 있는 NameNode 에 부담을 주지 않고 전체 파일 목록·크기·소유자를 분석할 수 있다. 작은 파일이 어디에 몰려 있는지 찾는 일이 대개 여기서 시작한다.
단계
hdfs dfsadmin -safemode get출력을 /root/hdp/meta/safemode.txt 에 저장하세요./data/finance/q1.csv를 /user/root/meta/q1.csv 로 올린 뒤 안전 모드에 들어가(-safemode enter) /user/root/meta/in-safemode 디렉터리를 만들어 보고, 오류 출력을 /root/hdp/meta/deny.txt 에 저장하세요.- 안전 모드인 채로
hdfs dfsadmin -saveNamespace를 하고, 새로 생긴 fsimage 의 txid(파일 이름의 숫자)를 /root/hdp/meta/fsimage_txid.txt 에 정수로 적으세요. - 안전 모드를 풀고(
-safemode leave) /user/root/meta/after-save 디렉터리를 만드세요. - 3단계의 fsimage 를
hdfs oiv -p XML로 /root/hdp/meta/fsimage.xml 에 풀어 쓰세요. - 같은 fsimage 를
hdfs oiv -p Delimited로 /root/hdp/meta/fsimage.tsv 에 풀어 쓰세요. hdfs dfsadmin -rollEdits로 지금 쓰는 edits 구간을 닫고, 4단계의 디렉터리 만들기가 들어 있는 닫힌 구간(edits_<시작>-<끝>)을hdfs oev로 /root/hdp/meta/edits.xml 에 풀어 쓴 뒤, 그 구간 이름과 OP_MKDIR 개수를 /root/hdp/meta/ops.json 에{"segment": "edits_…-…", "OP_MKDIR": 정수}로 쓰세요.- /root/hdp/meta/report.md 에
## 안전 모드## fsimage## edits세 절을 쓰세요. 둘째 절에 3단계의 txid 를, 셋째 절에 7단계의 OP_MKDIR 개수를 넣으세요.
참고
- NameNode 의 메타데이터 디렉터리:
/var/lib/hadoop/name/current—fsimage_<txid>(와.md5),edits_<시작>-<끝>(닫힌 구간),edits_inprogress_<시작>(쓰는 중),seen_txid. - fsimage 는 가장 최근 두 개만 남습니다(
dfs.namenode.num.checkpoints.retained). saveNamespace 를 여러 번 했다면 마지막 것의 txid 를 적으세요. hdfs oiv -p XML -i <fsimage> -o <출력>,hdfs oiv -p Delimited -i <fsimage> -o <출력>,hdfs oev -i <edits 파일> -o <출력>(기본 출력 형식이 XML).- 흔한 실수: 안전 모드를 풀지 않고 다음 단계로 가는 것(모든 쓰기가 실패합니다),
edits_inprogress_를 oev 로 열려는 것(닫힌 구간을 여세요). - 공식 문서: HDFS Architecture — The Persistence of File System Metadata · Offline Image Viewer · Offline Edits Viewer · HDFS Commands — dfsadmin
안전 모드인가
hdfs dfsadmin -safemode get 출력을 /root/hdp/meta/safemode.txt 에 저장하세요.
기동 직후에는 블록 보고가 모일 때까지 안전 모드였다가 스스로 나옵니다. 지금은 꺼져 있어야 합니다. 켜져 있다면 NameNode 가 아직 기동 중이거나 디스크가 모자란 것입니다.
안전 모드에서는 쓰기가 거절된다
/data/finance/q1.csv 를 HDFS /user/root/meta/q1.csv 로 올린 뒤 hdfs dfsadmin -safemode enter 로 안전 모드에 들어가, hdfs dfs -mkdir /user/root/meta/in-safemode 의 오류 출력을 /root/hdp/meta/deny.txt 에 저장하세요.
안전 모드는 네임스페이스를 얼려 둔 상태입니다. 읽기(ls·cat)는 되지만 이름을 바꾸는 모든 일이 거절됩니다. 다음 단계의 saveNamespace 는 바로 이 상태를 요구합니다 — 저장하는 동안 트리가 바뀌면 안 되기 때문입니다.
saveNamespace — 손으로 체크포인트
안전 모드인 채로 hdfs dfsadmin -saveNamespace 를 하고, /var/lib/hadoop/name/current 에 새로 생긴 fsimage_<txid> 의 txid 를 /root/hdp/meta/fsimage_txid.txt 에 정수로 적으세요.
saveNamespace 는 메모리의 네임스페이스를 새 fsimage 로 쓰고 edits 를 새 구간으로 넘깁니다. 파일 이름의 숫자는 '이 이미지에 반영된 마지막 트랜잭션 번호' 입니다. 앞의 0 은 빼고 정수로 적으세요.
안전 모드 풀고 다시 쓰기
hdfs dfsadmin -safemode leave 로 안전 모드를 풀고 /user/root/meta/after-save 디렉터리를 만드세요.
이 디렉터리는 3단계의 fsimage 에는 없고 edits 에만 기록됩니다. 5–7단계에서 그 차이를 눈으로 확인합니다.
fsimage 를 XML 로 풀기
3단계의 fsimage 파일(fsimage_<txid>)을 hdfs oiv -p XML -i <파일> -o /root/hdp/meta/fsimage.xml 로 풀어 쓰세요.
XML 의 NameSection 에 이 이미지의 txid 가, INodeSection 에 아이노드(파일·디렉터리)마다 이름·권한·블록이 들어 있습니다. q1.csv 의 블록 크기를 찾고, after-save 가 없는 것을 확인하세요. 채점기도 그 둘을 봅니다.
표로 풀기 — 분석은 이쪽이 편하다
같은 fsimage 를 hdfs oiv -p Delimited -i <파일> -o /root/hdp/meta/fsimage.tsv 로 풀어 쓰세요.
Delimited 는 아이노드마다 한 줄, 칸은 경로·복제 계수·수정 시각·블록 크기·블록 수·파일 크기·쿼터·권한·소유자·그룹입니다. 수백만 파일의 클러스터에서 '어느 디렉터리에 작은 파일이 몰려 있나' 를 찾을 때 이 표를 스프레드시트나 Spark 로 읽습니다.
edits 를 열어 변경 기록 읽기
hdfs dfsadmin -rollEdits 로 지금 쓰는 구간을 닫고, 4단계의 디렉터리 만들기가 들어 있는 닫힌 구간 edits_<시작>-<끝> 을 hdfs oev -i <파일> -o /root/hdp/meta/edits.xml 로 푸세요. 그 구간 이름과 그 안의 OP_MKDIR 개수를 /root/hdp/meta/ops.json 에 {"segment": "edits_…-…", "OP_MKDIR": 정수} 로 쓰세요.
edits 는 트랜잭션마다 OPCODE 와 TXID 가 붙은 기록입니다. 3단계의 txid 바로 뒤에서 시작하는 구간에 after-save 의 OP_MKDIR 이 있습니다. 닫히지 않은 edits_inprogress_ 는 열지 마세요.
메타데이터가 어디에 어떻게 남는지
/root/hdp/meta/report.md 에 ## 안전 모드 ## fsimage ## edits 세 절을 쓰세요. 둘째 절에 3단계의 txid 를, 셋째 절에 7단계의 OP_MKDIR 개수를 넣으세요.
NameNode 가 다시 뜰 때 fsimage 와 edits 를 어떤 순서로 쓰는지, after-save 가 어디에는 있고 어디에는 없었는지를 적으세요.