LabHub
배우기 러닝패스 코스

Apache Hadoop — Stand up and run HDFS and YARN in one pod

Open fsimage and edits and read the namespace

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

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 개수를 넣으세요.

참고

안전 모드인가

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 가 어디에는 있고 어디에는 없었는지를 적으세요.