June 18, 2012

Hadoop 1.0 뽀개기 (2) : MapReduce

작성자: 윤진석 (Edward J. Yoon)

맵리듀스MapReduce는 HDFS에 분산 저장된 데이터에 스트리밍 접근을 요청하며 빠르게 분산 처리하도록 고안된 프로그래밍 모델이며, 또한 이를 지원하는 시스템을 말한다.

시스템 내부 구조는 작업Job 및 모니터링을 관리하는 잡 트래커JobTracker와 실질적인 연산 업무를 처리하는 태스크 트래커TaskTracker로 구성된다. 잡트래커는 HDFS에 의해 분할 된 각 데이터 조각의 지역 특성을 고려하여 각 태스크 트래커에 적절한 업무를 할당하는 방법으로 효과적인 분산 처리가 가능하도록 한다.

프로그래밍 모델

맵리듀스란 이름은 애초 Lisp와 같은 함수형 언어의 맵map과 리듀스Reduce 함수 모델을 차용하면서 유래되었다. 데이터의 집합에 맵 함수를 적용하여 새로운 집합intermediate data을 만들고 다시 리듀스 함수를 적용해서 하나의 결과로 취합하는 과정으로 구성된다.

일반적인 함수형 언어와의 차이점은 키밸류 데이터 집합을 또다른 키밸류 데이터 집합으로 제한된다는 점이다. 예를 들어, 다음과 같이 Map에서 한 쌍의 키밸류 데이터를 입력받아 새로운 (K2, V2) 셋을 만들고, Reduce에서 K2로 그룹핑grouping된 V2 리스트를 집계 연산한다.

      Map (K1, V1) -> (K2, V2)
      Reduce (K2, sequence of V2) -> (K3, V3)

보통 Map의 역할이 데이터를 가공해서 분류하는데 있으므로 연산가공자Filter라 하고, Reduce의 역할은 분류된 데이터를 통합하는 데 있으므로 집계 연산자Aggregator라고도 한다. 하둡의 맵리듀스 프로그램은 이와 같이 두 함수의 구현을 통해 데이터 처리를 쉽게 병렬화 할 수 있고 범용적으로 활용 가능하다. 예를 들어, 웹 문서 URL과 내부 URL 링크셋 데이터가 있고, 자신을 링크하는 역 링크 URL 셋을 얻고자 한다. 그러면 Map에서 단지 거꾸로 데이터 셋을 가공하는 것으로 복잡한 데이터 처리 없이 쉽게 역 링크 정보를 얻을 수 있는 것이다.

하둡 분산 시스템에서의 프로그램 처리 흐름은 그림 1 과 같다. 잡 트래커로부터 청크 단위의 조각 파일을 할당 받은 태스크 트래커가 각 Map 함수 프로세서를 실행하여 데이터에 스트림 접근으로 Map 연산가공 과정을 수행하고 중간 데이터 셋을 생성하면, Reduce 함수 프로세서가 최종적으로 결과를 집계 연산한다.


그림 3. 맵리듀스의 처리 흐름

작업 스케쥴러Job Scheduler

시스템으로 전송되는 맵리듀스 작업Job은 순차적으로 처리하는 방식 및 우선순위, 효율적인 자원 공유를 지원하는 다양한 스케쥴러Scheduler를 제공한다. 하둡 1.0에서 제공되는 스케쥴러는 다음과 같다.

  • FIFO 스케쥴러, 작업 대기큐에 입력된 순서대로 처리하는 하둡이 기본으로 제공하는 스케쥴러이다. Fair 스케쥴러, 페이스북에서 개발한 스케쥴러로써 우수한 클러스터 자원resource 관리 기능을 제공한다. 작업을 풀 또는 유저로 그룹핑하고 각 풀 또는 유저에 최소 자원을 할당하여 균등한 자원 분배를 보장하고, 선점 기능을 통해 자원의 밸런스를 유지하여 각 작업의 성능을 보장한다. 
  • Capacity 스케쥴러, 야후에서 개발된 Fair 스케쥴러 이전의 자원 분배 스케쥴러로써 작업 대기큐에 사용될 태스크 프로세서 슬롯 갯수를 조절하여 자원을 분배한다. Fair 스케쥴러와는 달리 선점 기능이 없다.

기본 FIFO 스케쥴러 외 다른 스케쥴러를 설정하는 방법은 conf 디렉토리 밑의 mapred-site.xml 설정파일에 설정한다. 예를 들어, Fair 스케쥴러는 mapred-site.xml 파일에 다음과 같이 값을 설정하는 것으로 완료된다.

  <property>
    <name>mapred.jobtracker.taskScheduler</name>
    <value>org.apache.hadoop.mapred.FairScheduler</value>
  </property>

그리고, fair-scheduler.xml 설정파일에 다음과 같이 각 사용자 또는 풀의 최소 자원을 할당할 수 있다.

  <?xml version="1.0"?> 
  <allocations> 
    <pool name="sample_pool"> 
      <minMaps>5</minMaps>
      <minReduces>5</minReduces>
      <weight>2.0</weight>
    </pool>
    <user name="sample_user">
      <maxRunningJobs>6</maxRunningJobs>
    </user>
    <userMaxJobsDefault>3</userMaxJobsDefault>
  </allocations>

그러면 우리는 어떤 스케쥴러를 사용해야할까?

일반적으로 실제 서비스에 맞물려 구성된 배치작업은 그 작업에 헌신적으로 몰두하는dedicated 장비 구성과 기본으로 제공되는 FIFO 스케쥴러를 사용하는것이 바람직하고, 다수 개발자들의 연구 개발에 사용되는 공용 클러스터는 균등한 자원분배를 제공하는 Fair 스케쥴러를 사용한다.

No comments:

Post a Comment