MapReduce 자습서
MapReduce 자습서
MapReduce는 방대한 데이터를 저렴한 하드웨어 클러스터에서 병렬로 처리하게 해주는 소프트웨어 프레임워크예요. 수 테라바이트짜리 데이터셋을 수천 대 노드에 나눠, 신뢰성 있고 장애 허용(fault-tolerant) 방식으로 처리할 수 있게 해주죠. 이 자습서에서는 MapReduce 작업(Job)이 어떻게 흘러가는지, 맵(map)과 리듀스(reduce)가 어떤 역할을 하는지 기본기를 잡아볼게요.
본문
개요
MapReduce 작업(Job) 은 보통 입력 데이터셋을 서로 독립적인 조각으로 나누고, 각 조각을 맵 태스크(map tasks) 가 완전히 병렬로 처리해요. 프레임워크가 맵들의 출력을 정렬(sort)한 뒤, 그 결과를 리듀스 태스크(reduce tasks) 의 입력으로 넘겨줘요. 대개 작업의 입력과 출력 모두 파일 시스템에 저장되죠.
프레임워크가 담당하는 건 태스크 스케줄링과 모니터링, 그리고 실패한 태스크의 재실행이에요. 특이한 점은 계산 노드와 저장 노드가 보통 같은 노드라는 거예요. 즉 MapReduce 프레임워크와 HDFS가 같은 노드에서 도는데, 덕분에 데이터가 이미 있는 노드에 태스크를 배치해서 클러스터 전체의 대역폭 활용을 크게 높일 수 있어요.
MapReduce 프레임워크는 마스터인 ResourceManager, 클러스터 노드마다 하나씩 있는 워커 NodeManager, 애플리케이션마다 하나씩 있는 MRAppMaster로 구성돼요.
최소한으로, 애플리케이션은 입력/출력 위치를 지정하고 여러 인터페이스나 추상 클래스의 구현으로 map, reduce 함수를 제공해요. 이것들과 다른 작업 파라미터가 모여 작업 구성(job configuration) 이 되고, Hadoop 작업 클라이언트(job client) 가 이 작업(jar 등)과 구성을 ResourceManager에 제출해요. 그 다음부터는 리소스매니저가 소프트웨어와 구성을 워커에 배포하고, 태스크를 스케줄링하고 모니터링하며, 상태와 진단 정보를 작업 클라이언트에 전달해요.
한 가지 좋은 점은 프레임워크 자체가 Java로 구현되어 있어도 애플리케이션을 꼭 Java로 작성할 필요는 없다는 거예요. 다른 언어로도 만들 수 있는 경로가 두 가지 준비돼 있어요.
- Hadoop Streaming: 셸 유틸리티 같은 어떤 실행 파일이든 매퍼·리듀서로 사용해서 작업을 만들고 실행하는 유틸리티예요.
- Hadoop Pipes: SWIG 호환 C++ API로 MapReduce 애플리케이션을 구현하는 방식이에요 (JNI 기반이 아니에요).
작업 구성(Job Configuration)
Job은 사용자가 MapReduce 작업을 프레임워크에 설명하기 위한 기본 인터페이스예요. 작업 실행 방식을 제어하는 파라미터를 담고 있고, 프레임워크는 그 설명대로 작업을 실행하려고 해요. 각 클래스·인터페이스의 완전한 설명은 javadoc이 가장 정확하니, 이 문서는 자습서 수준으로 참고하면 돼요.
작업 입력(Job Input)
InputFormat이 MapReduce 작업의 입력 사양을 정의해요. 프레임워크는 작업의 InputFormat에 의존해서 입력 데이터를 어떻게 읽고, 맵 태스크로 나눌지(분할, split)를 결정해요.
작업 출력(Job Output)과 OutputCommitter
작업 출력은 OutputCommitter가 다뤄요. 초기화 단계에서 작업의 임시 출력 디렉터리를 만드는 등 작업 셋업을 담당하고, 작업이 PREP 상태에서 태스크 초기화 후 셋업 태스크가 완료되면 작업은 RUNNING 상태로 이동해요.
메모리 관리
mapreduce.{map|reduce}.java.opts는 MRAppMaster가 띄우는 자식 태스크의 옵션을 설정할 때만 쓰여요. 데몬 자체의 메모리 옵션은 Hadoop 데몬 환경 설정에서 다뤄요.
큐에 작업 제출하기(Submitting Jobs to Queues)
Hadoop은 기본적으로 default라는 필수 큐 하나를 갖고 있어요. 큐 이름은 사이트 구성의 mapreduce.job.queuename 속성으로 정의돼요. Capacity Scheduler 같은 일부 스케줄러는 여러 큐를 지원해서 워크로드별로 큐를 나눠 쓸 수 있어요.
예제: WordCount
WordCount는 MapReduce를 처음 배울 때 가장 자주 등장하는 예제예요. 문서에는 완전한 WordCount 소스가 v1.0(기본)과 v2.0(프레임워크의 여러 기능을 활용한 버전)으로 담겨 있는데요. v2.0은 DistributedCache 관련 기능 때문에 HDFS가 떠 있어야 해서, 의사분산(pseudo-distributed) 또는 완전분산 설치 환경에서만 동작해요.
더 알아보기
- YARN 아키텍처 — ResourceManager·NodeManager·ApplicationMaster 구조
- Hadoop Streaming — 비자바 맵리듀스 작성
- Capacity Scheduler — 멀티 큐 스케줄링