Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する
12MiB のファイルをブロックに分け、ディスクまで追いかける
한국어 원문으로 표시합니다.
목표
12MiB 파일을 블록 4MiB 로 올려 세 블록으로 쪼개지는 것을 fsck 로 보고, 그 블록이 DataNode 디스크 위의 평범한 파일이라는 것을 직접 찾아 확인한다. 복제 계수를 올렸을 때 DataNode 하나뿐인 클러스터에서 무슨 일이 생기는지, 작은 파일이 블록을 어떻게 먹는지, 블록 크기가 파일 체크섬을 어떻게 바꾸는지도 본다.
왜 중요한가
HDFS 에서 블록은 저장·복제·병렬 처리의 단위다. 파일은 블록 크기(기본 128MB)로 잘려 각 블록이 독립적으로 여러 DataNode 에 복제되고, 맵리듀스나 Spark 는 대개 블록 하나에 태스크 하나를 붙인다. 블록 크기를 정하는 것은 쓰는 쪽(클라이언트)이라 파일마다 다를 수 있다. 복제 계수도 파일마다 다르다. NameNode 는 블록마다 '지금 복제본이 몇 개인가' 를 세어 모자라면 다른 DataNode 에 복사를 지시한다. 복사할 곳이 없으면 복제 부족 상태로 남고 fsck 가 그것을 보고한다. 운영에서 fsck 의 복제 부족·누락 블록 숫자는 가장 먼저 보는 건강 지표다. 블록이 DataNode 디스크 위의 평범한 파일이라는 사실은 장애를 다룰 때 중요하다. 디스크 하나가 죽으면 그 위의 블록 파일들이 사라지고, NameNode 는 블록 보고로 그 사실을 알아 다른 복제본에서 다시 채운다.
단계
- HDFS 에 /user/root/blocks 를 만들고
/data/blobs/sample-12m.bin을 블록 크기 4MiB(-D dfs.blocksize=4194304)로 /user/root/blocks/big.bin 에 올리세요. hdfs fsck /user/root/blocks/big.bin -files -blocks -locations출력을 /root/hdp/blocks/fsck.txt 에 저장하세요.- 첫 번째 블록의 파일을 DataNode 데이터 디렉터리(
/var/lib/hadoop/data) 아래에서 찾아 그 절대 경로를 /root/hdp/blocks/block0.path 에 한 줄로 적으세요. - 같은 로컬 파일을 블록 크기를 주지 않고 /user/root/blocks/big-default.bin 으로 올리세요.
hdfs dfs -setrep 3 /user/root/blocks/big.bin으로 복제 계수를 3 으로 올리고(-w없이),hdfs fsck /user/root/blocks/big.bin출력을 /root/hdp/blocks/underrep.txt 에 저장하세요./data/small/sensor-0000.csv~sensor-0049.csv50개를 /user/root/blocks/tiny/ 에 올리고, 파일 수·블록 수·바이트 합을 /root/hdp/blocks/tiny.json 에{"files": 정수, "blocks": 정수, "bytes": 정수}로 쓰세요.hdfs dfs -checksum으로 big.bin 과 big-default.bin 의 체크섬을 기본 모드로 한 번,-D dfs.checksum.combine.mode=COMPOSITE_CRC로 한 번 구해 네 줄을 /root/hdp/blocks/checksum.txt 에 저장하세요.- /root/hdp/blocks/report.md 에
## 블록으로 쪼개기## 복제## 체크섬세 절을 쓰세요. 첫 절에 1단계의 블록 수를, 둘째 절에 5단계의 복제 부족 블록 수와 6단계의 블록 수를 넣으세요.
참고
- 블록 파일은
/var/lib/hadoop/data/current/BP-<블록 풀 ID>/current/finalized/subdir*/subdir*/blk_<ID>입니다. 옆의blk_<ID>_<세대>.meta는 체크섬 파일입니다.find /var/lib/hadoop/data -name 'blk_<ID>'로 찾으세요. -setrep -w는 복제가 다 될 때까지 기다리는데, DataNode 가 하나라 영원히 끝나지 않습니다.-w없이 쓰세요.- fsck 는 셸 명령(
hdfs fsck) 말고도 NameNode 웹의/fsck?ugi=root&path=...&files=1&blocks=1로 불러 볼 수 있습니다. - 흔한 실수: 블록 크기를 1MiB 보다 작게 주는 것(
dfs.namenode.fs-limits.min-block-size에 걸립니다),.meta파일을 블록 파일로 적는 것. - 공식 문서: HDFS Architecture — Data Replication · HDFS Commands — fsck · hdfs-default.xml · FileSystem Shell — checksum
블록 4MiB 로 올리기
HDFS 에 /user/root/blocks 를 만들고 /data/blobs/sample-12m.bin(12MiB)을 hdfs dfs -D dfs.blocksize=4194304 -put 으로 /user/root/blocks/big.bin 에 올리세요.
블록 크기는 클러스터 설정이 아니라 쓰는 순간 클라이언트가 정하는 값입니다. 12MiB ÷ 4MiB 이니 블록이 몇 개일지 먼저 계산해 보세요. 채점기는 NameNode 가 기억하는 블록 크기와 블록 수를 봅니다.
fsck 로 블록 보기
hdfs fsck /user/root/blocks/big.bin -files -blocks -locations 출력을 /root/hdp/blocks/fsck.txt 에 저장하세요.
블록마다 BP-…:blk_<ID>_<세대> 와 길이, 살아 있는 복제본 수, 복제본이 있는 DataNode 가 한 줄씩 나옵니다. 블록 풀(BP) ID 는 이 NameNode 의 네임스페이스 이름표입니다. 채점기는 여러분이 저장한 블록 ID 를 지금의 fsck 결과와 견줍니다.
블록은 디스크 위의 파일이다
2단계에서 본 첫 번째 블록의 파일을 /var/lib/hadoop/data 아래에서 찾아, 그 절대 경로를 /root/hdp/blocks/block0.path 에 한 줄로 적으세요.
find /var/lib/hadoop/data -name 'blk_<ID>' 로 찾습니다(.meta 가 붙지 않은 쪽). 그 파일의 크기와 원본 앞 4MiB 를 cmp 로 견줘 보세요 — HDFS 의 블록은 가공되지 않은 바이트 조각입니다. 채점기도 그렇게 봅니다.
기본 블록 크기로 올리면
같은 /data/blobs/sample-12m.bin 을 블록 크기를 주지 않고 /user/root/blocks/big-default.bin 으로 올리세요.
기본 블록 크기는 128MB 라서 12MiB 파일은 블록 하나에 다 들어갑니다. 블록이 파일보다 커도 디스크를 128MB 씩 먹지는 않습니다 — 블록 파일은 실제 길이만큼만 씁니다. 하지만 쿼터 실습에서 보듯 예약은 블록 크기 단위로 합니다.
복제 계수를 올렸는데 DataNode 가 하나라면
hdfs dfs -setrep 3 /user/root/blocks/big.bin 으로 복제 계수를 3 으로 올리고(-w 없이), hdfs fsck /user/root/blocks/big.bin 출력을 /root/hdp/blocks/underrep.txt 에 저장하세요.
NameNode 는 목표 복제 수를 3 으로 바꾸지만 복사할 DataNode 가 없어 블록들이 복제 부족으로 남습니다. fsck 요약의 Under-replicated blocks 와 Missing replicas 를 보세요. -w 를 주면 이 복제가 끝나기를 기다리므로 명령이 돌아오지 않습니다.
작은 파일도 블록 하나씩
/data/small/sensor-0000.csv ~ sensor-0049.csv 50개를 /user/root/blocks/tiny/ 에 올리고, 그 디렉터리의 파일 수·블록 수·바이트 합을 /root/hdp/blocks/tiny.json 에 {"files": 정수, "blocks": 정수, "bytes": 정수} 로 쓰세요.
파일마다 수백 바이트뿐인데 블록은 파일마다 하나입니다. NameNode 는 파일과 블록을 각각 객체로 메모리에 들고 있으니 작은 파일 50개는 객체 100개입니다. 블록 수는 fsck 요약의 Total blocks 로, 바이트는 hdfs dfs -du -s 로 구하세요.
블록 크기가 체크섬을 바꾼다
hdfs dfs -checksum /user/root/blocks/big.bin /user/root/blocks/big-default.bin 과 hdfs dfs -D dfs.checksum.combine.mode=COMPOSITE_CRC -checksum 같은 두 파일의 출력 네 줄을 /root/hdp/blocks/checksum.txt 에 저장하세요.
기본 파일 체크섬은 '청크 CRC 들의 MD5 들의 MD5' 라 블록 경계가 결과에 섞여 들어갑니다. 내용이 같아도 블록 크기가 다르면 값이 다르고, 그래서 블록 크기가 다른 클러스터 사이에서 distcp 검증이 어긋납니다. COMPOSITE_CRC 는 블록 경계와 무관한 CRC 를 만들어 같은 값을 냅니다.
블록·복제·체크섬을 숫자로
/root/hdp/blocks/report.md 에 ## 블록으로 쪼개기 ## 복제 ## 체크섬 세 절을 쓰세요. 첫 절에 1단계의 블록 수를, 둘째 절에 5단계의 복제 부족 블록 수와 6단계의 블록 수를 넣으세요.
블록 크기를 누가 정하는지, 복제 부족은 언제 생기고 누가 고치는지, 체크섬이 왜 블록 크기에 묶이는지를 한두 문장씩 적으세요.