LabHub
学习 学习路径 课程

Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · 작은 파일과 HAR · 实验

작은 파일 2,000개를 아카이브로 묶고 NameNode 객체 수를 잰다

在 LabHub 中继续学习

목표

센서 CSV 2,000개(파일 하나에 수백 바이트)를 HDFS 에 올려 NameNode 가 들고 있어야 하는 객체(파일·디렉터리·블록)가 몇 개인지 재고, 하둡 아카이브(HAR)로 묶어 그 수가 얼마나 주는지 본다. 묶은 뒤에도 har:// 로 원래 파일을 하나하나 읽을 수 있는 것과, distcp 로 아카이브를 통째로 옮기는 것까지 해 본다.

왜 중요한가

NameNode 는 파일·디렉터리·블록 하나하나를 자바 객체로 힙에 들고 있다. 파일이 1바이트든 1GB 든 객체 수는 같다. 그래서 HDFS 의 한계는 대개 디스크가 아니라 NameNode 의 힙이고, 수백만 개의 작은 파일은 디스크를 거의 쓰지 않으면서 NameNode 를 먼저 쓰러뜨린다. 맵리듀스·Spark 입장에서도 작은 파일은 파일마다 태스크나 열기 비용이 붙어 느리다.
해법은 파일을 덜 만드는 것이다 — 쓸 때 모아서 쓰거나(Spark 의 repartition·coalesce, 큰 컨테이너 파일 형식), 이미 생긴 것을 묶는다. HAR 은 뒤쪽 방법이다. 많은 파일을 큰 파일 몇 개(part-*)와 색인(_index·_masterindex)으로 바꿔 NameNode 의 객체 수를 줄이고, 읽을 때는 har:// 파일 시스템이 색인을 보고 원래 경로로 찾아 준다. 대신 한 번 만든 아카이브는 고칠 수 없다(읽기 전용).
이 실습은 아카이브와 distcp 를 YARN 없이 로컬 실행기로 돌린다. 둘 다 맵리듀스 잡이지만 실행 위치는 설정 하나로 바뀐다 — 같은 잡이 노트북에서도 클러스터에서도 돈다.

단계

1. /data/small 디렉터리(파일 2,000개)를 HDFS /user/root/small/raw 로 올리세요(hdfs dfs -put -t 8 로 여러 줄기로 올리면 빠릅니다).
2. raw 의 파일 수·디렉터리 수·블록 수를 /root/hdp/small/objects.json{"raw_files": 정수, "raw_dirs": 정수, "raw_blocks": 정수} 로 쓰세요.
3. hadoop archive -D mapreduce.framework.name=local -archiveName raw.har -p /user/root/small -r 1 raw /user/root/small/archive 로 아카이브를 만드세요.
4. hdfs dfs -ls -R har:///user/root/small/archive/raw.har 로 아카이브 안의 파일 수를 세어 /root/hdp/small/har_files.txt 에 정수로 적으세요.
5. har:// 경로로 raw/sensor-0042.csv 를 읽어 로컬 /root/hdp/small/sensor-0042.csv 에 저장하세요.
6. raw 와 raw.har 의 NameNode 객체 수(파일 + 디렉터리 + 블록)를 /root/hdp/small/compare.json{"raw_objects": 정수, "har_objects": 정수} 로 쓰세요.
7. hadoop distcp -D mapreduce.framework.name=local /user/root/small/archive /user/root/backup/small-archive 로 아카이브를 복사하세요.
8. /root/hdp/small/report.md## NameNode 가 치르는 값 ## HAR ## 옮기기 세 절을 쓰세요. 첫 절에 6단계의 raw_objects 를, 둘째 절에 har_objects 를 넣으세요.

참고

8个步骤

  1. 작은 파일 2,000개 올리기
  2. NameNode 가 들고 있는 객체 세기
  3. 아카이브로 묶기
  4. har:// 로 안을 보기
  5. 아카이브 안의 파일 하나 읽기
  6. 객체 수를 견주기
  7. distcp 로 통째로 옮기기
  8. 작은 파일의 값을 숫자로