LabHub
배우기 러닝패스 코스

Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する

12MiB のファイルをブロックに分け、ディスクまで追いかける

LabHub 에서 이어서 보기

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

목표

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단계의 블록 수를 넣으세요.

참고

블록 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 blocksMissing 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.binhdfs 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단계의 블록 수를 넣으세요.

블록 크기를 누가 정하는지, 복제 부족은 언제 생기고 누가 고치는지, 체크섬이 왜 블록 크기에 묶이는지를 한두 문장씩 적으세요.