Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する
1 ポッドの HDFS にファイルを置き、二つの道で読む
한국어 원문으로 표시합니다.
목표
파드 하나에 뜬 의사 분산 HDFS 의 설정과 상태를 확인하고, 접근 로그 하나를 올려 셸(hdfs dfs)과 HTTP(WebHDFS) 두 길로 읽는다. 파일을 옮기는(mv) 일이 NameNode 의 이름표만 바꾸는 일이라는 것을 fileId 와 블록 ID 로 확인한다.
왜 중요한가
HDFS 는 역할을 둘로 나눈 파일 시스템이다. NameNode 는 디렉터리 트리와 '이 파일은 어떤 블록들이고 그 블록은 어느 DataNode 에 있다' 는 메타데이터를 메모리에 들고 있고, DataNode 는 블록의 바이트를 자기 디스크에 파일로 들고 있다. 클라이언트는 NameNode 에게 자리를 묻고 바이트는 DataNode 와 직접 주고받는다.
이 분리를 알면 운영의 많은 것이 설명된다. 이름 바꾸기와 옮기기는 바이트를 건드리지 않으니 크기와 상관없이 즉시 끝나고, NameNode 가 멈추면 바이트가 멀쩡해도 아무것도 읽을 수 없다. 설정이 어디서 오는지(*-site.xml 이 *-default.xml 을 덮는다)도 같은 이유로 중요하다 — 클라이언트와 데몬이 서로 다른 설정을 보면 같은 명령이 다르게 동작한다.
WebHDFS 는 같은 NameNode 에 HTTP 로 묻는 길이다. 자바 클라이언트 없이 curl 하나로 목록·상태·내용을 받을 수 있어서, 스크립트와 모니터링은 대개 이 길을 쓴다.
단계
hdfs getconf -confKey로fs.defaultFS·dfs.replication·dfs.blocksize를 물어 /root/hdp/first/conf.txt 에키=값세 줄로 쓰세요.hdfs dfsadmin -report출력을 /root/hdp/first/report.txt 에 저장하세요.- HDFS 에 /user/root/first/logs 디렉터리를 만드세요.
/data/logs/access-2026-03-01.log를 /user/root/first/logs/ 에 올리세요.hdfs dfs -cat으로 그 파일의 줄 수를 세어 /root/hdp/first/lines.txt 에 정수로 적으세요.- curl 로 WebHDFS 의
LISTSTATUS를 불러 /user/root/first/logs 목록 응답을 /root/hdp/first/liststatus.json 에 저장하세요. - /user/root/first/archive 를 만들고 로그 파일을 /user/root/first/archive/access-0301.log 로 옮긴 뒤,
hdfs fsck <새 경로> -files -blocks출력을 /root/hdp/first/blocks.txt 에 저장하세요. - /root/hdp/first/report.md 에
## 두 역할## 두 길## 이름만 바뀐다세 절을 쓰세요. 둘째 절에 5단계의 줄 수를, 셋째 절에 옮기기 전후 같았던 fileId 를 넣으세요.
참고
- HDFS 는 파드가 뜰 때 이미 켜져 있습니다(
lab-hadoop status). 꺼졌다면lab-hadoop start로 켭니다. 데이터는 NameNode·DataNode 의 디스크에 남아 있어 다시 켜면 그대로입니다. hdfs dfs명령 하나가 JVM 하나라 1–2초 걸립니다.export HADOOP_ROOT_LOGGER=WARN,console로 로그를 줄이면 출력이 깔끔합니다.- WebHDFS:
curl -s "http://localhost:9870/webhdfs/v1<경로>?op=LISTSTATUS&user.name=root". 내용을 받는op=OPEN은 DataNode 로 넘겨주므로(307)curl -L이 필요합니다. - 흔한 실수: 로컬 경로와 HDFS 경로를 헷갈리는 것(
/user/root/...는 HDFS 안),-report를 NameNode 가 뜨기 전에 찍는 것, mv 로 파일이 복사된다고 여기는 것. - 공식 문서: HDFS Architecture · Pseudo-Distributed Operation · FileSystem Shell · WebHDFS REST API
설정은 어디서 오나
hdfs getconf -confKey <키> 로 fs.defaultFS, dfs.replication, dfs.blocksize 세 값을 물어 /root/hdp/first/conf.txt 에 fs.defaultFS=값 처럼 키=값 세 줄로 쓰세요.
앞의 둘은 이 이미지가 core-site.xml·hdfs-site.xml 에서 바꾼 값이고, 블록 크기는 아무도 바꾸지 않아 hdfs-default.xml 의 기본값이 나옵니다. 사이트 파일이 기본 파일을 덮는다는 규칙이 이 셋에서 다 보입니다.
NameNode 가 보는 클러스터
hdfs dfsadmin -report 의 출력을 /root/hdp/first/report.txt 에 저장하세요.
보고서의 위쪽은 클러스터 전체(용량·사용량·복제 부족 블록), 아래쪽은 DataNode 마다의 상태입니다. 살아 있는 DataNode 가 몇 대인지, 설정된 용량이 얼마인지 보세요. 채점기는 같은 숫자를 NameNode 의 JMX 에서 읽어 견줍니다.
HDFS 안에 자리 만들기
HDFS 에 /user/root/first/logs 디렉터리를 만드세요(중간 디렉터리까지).
hdfs dfs -mkdir -p 입니다. 디렉터리는 NameNode 의 메타데이터에만 있고 DataNode 에는 아무것도 생기지 않습니다 — 디렉터리에는 블록이 없습니다.
파일 올리기
로컬 /data/logs/access-2026-03-01.log 를 HDFS /user/root/first/logs/ 에 같은 이름으로 올리세요.
hdfs dfs -put 은 NameNode 에게 블록 자리를 받아 DataNode 로 바이트를 흘려 보냅니다. 올리는 동안에는 ._COPYING_ 이 붙은 이름으로 있다가 끝나면 제 이름이 됩니다. 채점기는 길이와 내용을 로컬 원본과 견줍니다.
셸로 읽기
hdfs dfs -cat 으로 /user/root/first/logs/access-2026-03-01.log 를 읽어 줄 수를 세고 /root/hdp/first/lines.txt 에 정수로 적으세요.
hdfs dfs -cat 경로 | wc -l. 바이트는 DataNode 에서 직접 옵니다. 로컬 원본과 줄 수가 같은지도 스스로 견줘 보세요.
HTTP 로 읽기 — WebHDFS
curl 로 http://localhost:9870/webhdfs/v1/user/root/first/logs?op=LISTSTATUS&user.name=root 를 불러 응답 JSON 을 /root/hdp/first/liststatus.json 에 그대로 저장하세요.
응답의 FileStatuses.FileStatus 에 파일마다 길이·블록 크기·복제 계수·소유자·fileId(아이노드 번호)가 들어 있습니다. fileId 를 기억해 두세요 — 다음 단계에서 옮긴 뒤에도 같은지 봅니다.
옮기기는 이름표만 바꾼다
HDFS 에 /user/root/first/archive 를 만들고 로그 파일을 /user/root/first/archive/access-0301.log 로 hdfs dfs -mv 하세요. 그다음 hdfs fsck /user/root/first/archive/access-0301.log -files -blocks 출력을 /root/hdp/first/blocks.txt 에 저장하세요.
mv 는 NameNode 안에서 이름만 바꿉니다. 그래서 fileId 가 그대로이고 블록 ID 도 그대로이며, 파일이 1TB 여도 즉시 끝납니다. 채점기는 6단계에 저장한 fileId 와 지금의 fileId, 그리고 여러분이 저장한 블록 ID 와 지금의 블록 ID 를 견줍니다.
두 역할을 숫자로 남기기
/root/hdp/first/report.md 에 ## 두 역할 ## 두 길 ## 이름만 바뀐다 세 절을 쓰세요. 둘째 절에 5단계의 줄 수를, 셋째 절에 옮기기 전후 같았던 fileId 를 숫자로 넣으세요.
첫 절에는 NameNode 와 DataNode 가 각각 무엇을 들고 있는지, 둘째 절에는 셸과 WebHDFS 가 같은 파일을 어떻게 보여 줬는지, 셋째 절에는 mv 뒤에 무엇이 그대로였는지를 적으세요.