LabHub
배우기 러닝패스 코스

Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · MapReduce · 실습

낱말 세기와 TeraSort 를 YARN 에 올리고 카운터로 읽는다

LabHub 에서 이어서 보기

목표

YARN 을 켜고 책 다섯 편의 낱말을 맵리듀스로 센다. 잡이 끝난 뒤 HDFS 에 남은 잡 이력(.jhist)을 열어 카운터를 읽고, 리듀서 수를 바꿨을 때 출력이 어떻게 나뉘는지, 셔플이 정렬을 어떻게 보장하는지를 TeraSort 로 확인한다.

왜 중요한가

맵리듀스는 요즘 새로 쓰는 일이 드물지만, 그 모델 — 맵이 (키, 값)을 내고, 프레임워크가 키로 모아 정렬해 넘기고(셔플), 리듀스가 키마다 합친다 — 은 Spark·Flink·SQL 엔진의 셔플이 전부 물려받았다. 셔플이 왜 비싼지, 컴바이너(맵 쪽 미리 합치기)가 왜 셔플을 줄이는지, 리듀서 수가 왜 출력 파일 수가 되는지를 여기서 가장 적나라하게 볼 수 있다.
카운터는 잡이 무엇을 했는지를 숫자로 남긴 기록이다. 맵이 몇 줄을 읽고 몇 줄을 냈는지, 컴바이너가 몇 줄로 줄였는지, 리듀스가 키 몇 개를 받았는지. 결과가 이상할 때 가장 먼저 보는 곳이고, 잡이 끝난 뒤에도 이력 파일에 남아 있다.
이 파드의 YARN 은 파드 메모리(2Gi)에 맞춰 컨테이너를 작게 잡아 두었다(AM 384MB, 맵·리듀스 256MB). 그래서 태스크가 한두 개씩 차례로 돈다 — 느려도 결과와 카운터는 같다.

단계

1. lab-hadoop start yarn 으로 YARN 을 켜고 yarn node -list -all 출력을 /root/hdp/mr/nodes.txt 에 저장하세요.
2. /data/books/book-*.txt 다섯 편을 HDFS /user/root/mr/in/ 에 올리세요.
3. 예제 jar 의 wordcount/user/root/mr/in 을 세어 /user/root/mr/wc 에 쓰세요.
4. 3단계 잡의 ID(job_…)를 /root/hdp/mr/jobid.txt 에 적으세요.
5. 그 잡의 이력 파일(.jhist)에서 TaskCounter 의 MAP_INPUT_RECORDS·MAP_OUTPUT_RECORDS·COMBINE_INPUT_RECORDS·COMBINE_OUTPUT_RECORDS·REDUCE_INPUT_GROUPS·REDUCE_OUTPUT_RECORDS 를 꺼내 /root/hdp/mr/counters.json 에 쓰세요.
6. 같은 wordcount 를 리듀서 3개(-D mapreduce.job.reduces=3)로 /user/root/mr/wc3 에 쓰세요.
7. teragen 으로 10만 줄을 /user/root/mr/tera-in 에 만들고, terasort/user/root/mr/tera-out 에 정렬한 뒤, teravalidate/user/root/mr/tera-val 에 검증 결과를 쓰세요.
8. /root/hdp/mr/report.md## 맵과 리듀스 ## 카운터 ## 정렬 세 절을 쓰세요. 둘째 절에 5단계의 MAP_OUTPUT_RECORDSCOMBINE_OUTPUT_RECORDS 를 넣으세요.

참고

8단계

  1. YARN 켜기
  2. 입력 올리기
  3. wordcount 돌리기
  4. 잡 이력 찾기
  5. 카운터 읽기
  6. 리듀서 셋이면 출력도 셋
  7. TeraSort — 셔플이 정렬을 만든다
  8. 셔플을 숫자로 남기기