Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · NameNode 메타데이터 · 实验
fsimage 와 edits 를 열어 네임스페이스를 읽는다
목표
NameNode 가 네임스페이스를 어떻게 디스크에 남기는지 — 한 시점의 스냅숏인 fsimage 와 그 뒤의 변경 기록인 edits — 를 직접 열어 본다. 안전 모드에서 쓰기가 거절되는 것을 보고, saveNamespace 로 새 fsimage 를 만들고, 오프라인 이미지 뷰어(oiv)와 편집 로그 뷰어(oev)로 내용을 읽는다.
왜 중요한가
NameNode 는 파일 트리 전체를 메모리에 들고 일한다. 메모리는 꺼지면 사라지므로 두 가지를 디스크에 남긴다. fsimage 는 어느 트랜잭션 번호(txid)까지의 네임스페이스 전체이고, edits 는 그 뒤에 일어난 변경(디렉터리 만들기, 파일 닫기, 이름 바꾸기 …)을 한 줄씩 적은 기록이다. NameNode 가 다시 뜰 때는 fsimage 를 읽고 그 뒤의 edits 를 다시 적용한다.
edits 가 길어지면 기동이 느려지므로 주기적으로 fsimage 에 합쳐야 한다(체크포인트). 운영에서는 보조 NameNode 나 대기 NameNode 가 하고, 이 실습에서는 관리자 명령 saveNamespace 로 직접 한다. 그 명령이 안전 모드를 요구하는 이유는 저장하는 동안 네임스페이스가 바뀌면 안 되기 때문이다.
안전 모드는 NameNode 가 읽기만 받는 상태다. 기동 직후 DataNode 들의 블록 보고가 충분히 모일 때까지 자동으로 들어가고, 관리자가 작업을 위해 손으로 넣기도 한다. "쓰기가 전부 실패한다" 는 장애의 흔한 원인이다.
fsimage 를 오프라인으로 읽을 줄 알면, 살아 있는 NameNode 에 부담을 주지 않고 전체 파일 목록·크기·소유자를 분석할 수 있다. 작은 파일이 어디에 몰려 있는지 찾는 일이 대개 여기서 시작한다.
단계
1. hdfs dfsadmin -safemode get 출력을 /root/hdp/meta/safemode.txt 에 저장하세요.
2. /data/finance/q1.csv 를 /user/root/meta/q1.csv 로 올린 뒤 안전 모드에 들어가(-safemode enter) /user/root/meta/in-safemode 디렉터리를 만들어 보고, 오류 출력을 /root/hdp/meta/deny.txt 에 저장하세요.
3. 안전 모드인 채로 hdfs dfsadmin -saveNamespace 를 하고, 새로 생긴 fsimage 의 txid(파일 이름의 숫자)를 /root/hdp/meta/fsimage_txid.txt 에 정수로 적으세요.
4. 안전 모드를 풀고(-safemode leave) /user/root/meta/after-save 디렉터리를 만드세요.
5. 3단계의 fsimage 를 hdfs oiv -p XML 로 /root/hdp/meta/fsimage.xml 에 풀어 쓰세요.
6. 같은 fsimage 를 hdfs oiv -p Delimited 로 /root/hdp/meta/fsimage.tsv 에 풀어 쓰세요.
7. hdfs dfsadmin -rollEdits 로 지금 쓰는 edits 구간을 닫고, 4단계의 디렉터리 만들기가 들어 있는 닫힌 구간(edits_<시작>-<끝>)을 hdfs oev 로 /root/hdp/meta/edits.xml 에 풀어 쓴 뒤, 그 구간 이름과 OP_MKDIR 개수를 /root/hdp/meta/ops.json 에 {"segment": "edits_…-…", "OP_MKDIR": 정수} 로 쓰세요.
8. /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](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#The_Persistence_of_File_System_Metadata) · [Offline Image Viewer](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HdfsImageViewer.html) · [Offline Edits Viewer](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HdfsEditsViewer.html) · [HDFS Commands — dfsadmin](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#dfsadmin)
8个步骤
- 안전 모드인가
- 안전 모드에서는 쓰기가 거절된다
- saveNamespace — 손으로 체크포인트
- 안전 모드 풀고 다시 쓰기
- fsimage 를 XML 로 풀기
- 표로 풀기 — 분석은 이쪽이 편하다
- edits 를 열어 변경 기록 읽기
- 메타데이터가 어디에 어떻게 남는지