Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · 블록과 복제 · 실습
12MiB 파일을 블록으로 쪼개 디스크까지 따라간다
목표
12MiB 파일을 블록 4MiB 로 올려 세 블록으로 쪼개지는 것을 fsck 로 보고, 그 블록이 DataNode 디스크 위의 평범한 파일이라는 것을 직접 찾아 확인한다. 복제 계수를 올렸을 때 DataNode 하나뿐인 클러스터에서 무슨 일이 생기는지, 작은 파일이 블록을 어떻게 먹는지, 블록 크기가 파일 체크섬을 어떻게 바꾸는지도 본다.
왜 중요한가
HDFS 에서 블록은 저장·복제·병렬 처리의 단위다. 파일은 블록 크기(기본 128MB)로 잘려 각 블록이 독립적으로 여러 DataNode 에 복제되고, 맵리듀스나 Spark 는 대개 블록 하나에 태스크 하나를 붙인다. 블록 크기를 정하는 것은 쓰는 쪽(클라이언트)이라 파일마다 다를 수 있다.
복제 계수도 파일마다 다르다. NameNode 는 블록마다 '지금 복제본이 몇 개인가' 를 세어 모자라면 다른 DataNode 에 복사를 지시한다. 복사할 곳이 없으면 복제 부족 상태로 남고 fsck 가 그것을 보고한다. 운영에서 fsck 의 복제 부족·누락 블록 숫자는 가장 먼저 보는 건강 지표다.
블록이 DataNode 디스크 위의 평범한 파일이라는 사실은 장애를 다룰 때 중요하다. 디스크 하나가 죽으면 그 위의 블록 파일들이 사라지고, NameNode 는 블록 보고로 그 사실을 알아 다른 복제본에서 다시 채운다.
단계
1. HDFS 에 /user/root/blocks 를 만들고 /data/blobs/sample-12m.bin 을 블록 크기 4MiB(-D dfs.blocksize=4194304)로 /user/root/blocks/big.bin 에 올리세요.
2. hdfs fsck /user/root/blocks/big.bin -files -blocks -locations 출력을 /root/hdp/blocks/fsck.txt 에 저장하세요.
3. 첫 번째 블록의 파일을 DataNode 데이터 디렉터리(/var/lib/hadoop/data) 아래에서 찾아 그 절대 경로를 /root/hdp/blocks/block0.path 에 한 줄로 적으세요.
4. 같은 로컬 파일을 블록 크기를 주지 않고 /user/root/blocks/big-default.bin 으로 올리세요.
5. hdfs dfs -setrep 3 /user/root/blocks/big.bin 으로 복제 계수를 3 으로 올리고(-w 없이), hdfs fsck /user/root/blocks/big.bin 출력을 /root/hdp/blocks/underrep.txt 에 저장하세요.
6. /data/small/sensor-0000.csv ~ sensor-0049.csv 50개를 /user/root/blocks/tiny/ 에 올리고, 파일 수·블록 수·바이트 합을 /root/hdp/blocks/tiny.json 에 {"files": 정수, "blocks": 정수, "bytes": 정수} 로 쓰세요.
7. hdfs dfs -checksum 으로 big.bin 과 big-default.bin 의 체크섬을 기본 모드로 한 번, -D dfs.checksum.combine.mode=COMPOSITE_CRC 로 한 번 구해 네 줄을 /root/hdp/blocks/checksum.txt 에 저장하세요.
8. /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](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication) · [HDFS Commands — fsck](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#fsck) · [hdfs-default.xml](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml) · [FileSystem Shell — checksum](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-common/FileSystemShell.html#checksum)
8단계
- 블록 4MiB 로 올리기
- fsck 로 블록 보기
- 블록은 디스크 위의 파일이다
- 기본 블록 크기로 올리면
- 복제 계수를 올렸는데 DataNode 가 하나라면
- 작은 파일도 블록 하나씩
- 블록 크기가 체크섬을 바꾼다
- 블록·복제·체크섬을 숫자로