Like children who playing on the seashore.

The adults digs the sand for clams, the children builds sand castles. 
Pure sentiment. Sometimes I want to live like children who playing on the seashore.

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 스케쥴러를 사용한다.

Hadoop 1.0 뽀개기

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

이번 포스트는 하둡 1.0의 핵심 구성 요소 HDFS와 맵리듀스MapReduce, 그리고 대용량 준정형 데이터semi-structured data 저장소 HBase 데이터 모델의 기본 개념을 소개하겠다.

  • 하둡 1.0 은 대용랑 파일을 저장할 수 있는 분산 파일시스템 HDFS와 이를 분산 처리 할 수 있는 맵리듀스 컴퓨팅 프레임워크로 구성되어 있다.
  • 맵리듀스 프로그래밍 모델은 복잡한 분산 컴퓨팅을 키/밸류 기반으로 단순화된 모델을 제공한다.
  • HBase는 하둡 분산 파일시스템 기반에서 대용량 비정형 데이터 관리를 할 수 있게 하는 분산 스토리지이다.
  • 칼럼 패밀리와 시계열이 추가된 다차원 테이블 모델을 갖고 있으며, HBase의 칼럼 지향 아키텍처는 빠른 랜덤 억세스와 저장의 효율성을 보장한다.
  • 위 언급된 모든 시스템은 웹 기반 관리 도구와 장애 허용 능력Fault Tolerance Capability을 갖추고 있다.

1. 하둡 분산 파일 시스템, HDFS

HDFS란?

하둡의 분산 파일 시스템, HDFSHadoop Distributed File System는 모든 기능의 밑 바탕이 되는 클러스터 기반 가상 파일 시스템이다. HDFS의 디자인은 대용량 데이터를 저가의 서버에 분산 저장하고 여러 번 읽기에 최적화된write-once-read-many 단순한 목적과 자동 복구 기능에 집중하고 있다. 이에 가장 두드러지는 특징이 바로 무한대의 선형 확장성이다. 파일과 디렉토리의 개수는 네임 노드의 메모리 크기에 제한을 받지만 최대 볼륨 크기, 파일 크기에는 제한이 없다. 그리고, 데이터를 여러 서버에 복제하여 각 서버에 고가의 RAID 구성을 필요로 하지 않고도 장애 복구Fail-over 가 가능하도록 하였다.

내부적으로 정확한 세부 사항은 상당히 다르지만 일반적인 파일 시스템의 자료구조와 상당히 유사한 구조를 지닌다. 즉 인덱스 노드와 데이터 블록이 중심 개념이며 전통적인 계층 구조의 파일시스템을 제공한다. 하둡 HDFS는 분산 환경에 매스터/슬레이브Master/Slave 구조로 파일과 디렉터리의 읽기open, 닫기close, 이름 변경rename 및 복제replication 등 파일 시스템의 네임스페이스 기능을 수행하는 네임 노드NameNode와 데이터 블록 파일을 저장하고 클라이언트가 요구하는 읽기read, 쓰기write 기능들을 담당하는 데이터 노드DataNode로 구성된다.

데이터 복제

HDFS 내 하나의 파일은 청크Chunk 단위의 작은 블록 파일들로 나뉘어 데이터 노드에 분산 저장된다. 블록 사이즈와 복제 인수는 사용자가 파일마다 설정할 수 있다. 복제를 배치하는 정책은 파일 시스템의 신뢰성, 가용성 그리고 네트워크 대역폭을 효율적으로 사용할 수 있도록 랙 인식 기능을 사용한다.

HDFS의 기본적인 복제 정책은 랙 사이의 쓰기 트래픽을 최소화하면서 신뢰성을 유지하기 위해 로컬이 포함된 랙의 데이터노드에 2개를 복제하고 다른 랙의 데이터 노드에 1개를 복제한다. 이러한 데이터 블록 복제는 디스크와 서버 장애 발생 시 파일이 안전하게 유지되고 자동으로 복구Fail-over 할 수 있도록 이용되며, 또한 데이터의 지역 특성Data locality을 고려한 효율적인 분산 컴퓨팅 구조에도 활용된다.

그림 2. 데이터 노드의 블록 배치 정책

상황에 따라 데이터의 복제를 기본 3개 씩 두는 것이 부담이 될 수 있지만 데이터의 중요성을 고려하여 복제의 수를 조절할 수 있다. 5 장 하둡 2.0 에서는 페이스북의 HDFS RAID 모듈과 패리티 블록Parity block을 통한 복제 갯수 및 클러스터 용량의 최소화 방안이 소개된다.

HDFS 파일 시스템 내 손상된 파일이 있는지 보려면 fsck 명령어를 사용하여 확인할 수 있다. 그러나 데이터 노드가 최초에 블록을 복제하는 동안 장애가 발생했다거나 복제된 모든 블록 파일이 손상된 특수한 상황이 아니라면 시스템에 의해 자동 복구 되기 때문에 일반적으로 특별한 관리는 필요 없다.

복구Fail-Over

HDFS에서 자동 복구가 되지 않는 부분은 파일 시스템 이미지FsImage와 변경로그EditLog를 관리하는 네임 노드의 파일 장애 문제이다. 가장 이상적인 접근 방법은 fs.checkpoint.dir 설정 값을 다른 서버의 로컬 파일 시스템 또는 네트워크 결합 스토리지Network-attached Storage로 설정하여 체크포인팅Checkpointing하는 방법으로 최악의 경우를 고려하고, 이와 더불어 dfs.name.dir 경로에 현재의 이미지와 변경로그를 저장하여 세컨드리 네임 노드Secondary NameNode 를 통해 파일 시스템 정보를 주기적으로 동기화 하는 것으로 다음과 같이 네임 노드의 장애를 대응하는 것이다.

  • 단순히 네임 노드가 죽고 dfs.name.dir 의 파일들이 손상되지 않은 경우엔 네임 노드를 재시작 하는 것으로 간단히 복구 된다.
  • 파일 시스템 이미지가 손상되었거나 네임 노드 서버가 물리적인 장애로 복구가 불가능한 경우에는 새로운 서버에 네임 노드를 설치하여 -importCheckpoint 옵션과 함께 재시작하는 것으로 복구 할 수 있다. 이 때, dfs.name.dir 은 반드시 비어있는 경로로 다시 정해주어야 한다.

네임 노드가 재시작 되면 안전 모드로 사용 가능한 데이터 노드로 부터 블록리포트Blockreport를 받아 데이터 블록의 메타 데이터와 복제 수를 확인하고 복제를 관리한 후 일반 모드로 빠져나간다.

접근성

HDFS에는 다양한 방법으로 응용 프로그램이 접근할 수 있게 한다. 하둡 1.0에서는 자바 및 C언어를 위한 API와 Web기반 브라우저 기능이 있으며, 또한 관리자나 스크립팅 언어에 활용될 수 있는 DFS 쉘 인터페이스를 제공한다. 이 책에서는 쉘 인터페이스를 살펴보기로 한다 (HDFS API는 하둡 공식 문서 참조).
  cat
           파일의 내용을 stdout으로 출력한다.
  chgrp
           파일의 그룹을 변경한다.
  chmod
           파일의 권한을 변경한다.
  chown
           파일의 오너를 변경한다.
  copyFromLocal
           로컬 파일 시스템에 파일을 HDFS로 복사한다.
           소스 파일이 로컬 파일로 제한되는 점을  제외하면 put 명령어와 유사하다.
  copyToLocal
           HDFS에 파일을 로컬 파일 시스템으로 복사한다.
           대상이 로컬 파일 시스템으로 제한되는점을 제외하면 get 명령어와 유사하다.
  count
           지정된 패턴과 일치하는 경로의 디렉토리, 파일 및 바이트의 수를 카운트한다.
  cp
           파일을 복사한다. 이 명령어는 여러 파일을 한꺼번에 복사 할 수 있다.
  du
           디렉토리 내 파일 크기 길이의 합, 또는 파일의 길이를 출력한다.
  dus
           파일 길이의 요약을 표시한다.
  expunge
           휴지통을 비운다. (휴지통 기능에 대한 자세한 내용은 4장 HDFS 아키텍처를 참조).
  get
           파일을 로컬 파일 시스템에 복사한다. CRC 검사에 실패하는 파일은 
           -ignorecrc 옵션으로 복사할 수 있다. 파일 및 CRC 파일은 -CRC 옵션을 사용하여 
           복사할 수 있다.
  getmerge
           소스 디렉터리 내 파일을 대상 파일로 병합한다. addnl 옵션은 각 파일의 끝에 
           개행 문자를 추가할 수 있도록 설정할 수 있다.
  ls
           파일인 경우에는 퍼미션, 복제된 수, 유저아이디, 그룹아이디, 파일 사이즈와 변경된 
           날짜 및 파일 이름을 보여준다. 디렉토리는  퍼미션, 유저아이디, 그룹아이디, 변경된 
           날짜 및 디렉토리 이름과 디렉토리 내 파일 또는 하위디렉토리 목록을 보여준다.
  lsr
           디렉토리 하위의 모든 파일과 디렉토리에 목록을 재귀적으로 보여준다. 
           유닉스의 ls -R 명령과 유사하다.
  mkdir
           경로 uri를 인자값으로 받아 디렉토리를 생성한다. 
           유닉스의 mkdir -p 명령어로 상위 디렉토리까지 모두 만드는 것과 같이 작동한다.
  moveFromLocal
           복제된 이후 localsrc가 삭제되는것을 제외하고 put 명령어와 유사하다.
  moveToLocal
           하둡 1.0 버전에서는 구현되어있지 않다.
  mv
           소스에서 대상지로 파일을 이동한다. 이 명령은 대상지가 디렉토리인 경우 다수의 
           소스를 입력하는 것이 허용된다. 다른 파일 시스템과의 파일 이동은 허용되지 않는다.
  put
           로컬 파일 시스템의 단일 또는 다수의 소스를 대상 파일 시스템에 복사한다. 
           또한 STDIN의 입력을 읽어 대상 파일 시스템에 기록하는 것이 가능하다.
  rm
           인자로 지정된 파일을 삭제한다. 오직 비어있지 않은 디렉토리와 파일을 삭제한다. 
           휴지통 기능이 활성화된 경우 -skipTrash 옵션을 사용하면 무시되어 지정된 파일을 
           즉시 삭제한다. 이것은 디렉토리에 불필요하게 큰 파일을 삭제하는 데 필요한 때 유용하다. 
           재귀적인 삭제는 rmr을 참조.
  rmr
           재귀적으로 delete 명령어를 수행한다. -skipTrash 옵션은 rm 명령어와 동일하게 작동한다.
  setrep
           파일의 복제 개수를 변경한다. -R 옵션은 재귀적으로 디렉토리 내 파일들의 복제 개수를 
           증가하는데 사용된다.
  stat
           경로의 상태 정보를 보여준다.
  tail
           STDOUT으로 파일의 마지막 킬로 바이트를 보여준다. 유닉스와 같이 -f 옵션을 
           사용할 수 있다.
  test
           경로를 받아 -[ezd] 옵션으로 파일이 존재하는지, 파일 크기가 0인지, 
           그리고 디렉토리인지를 확인한다.
  text
           파일을 가져와서 텍스트 형식으로 파일을 출력한다. 허용되는 형식은 
           zip TextRecordInputStream 이다.
  touchz
           크기가 0 바이트인 파일을 생성한다.

이제 로컬 파일 시스템의 파일을 copyFromLocal 명령어로 하둡 분산 시스템에 다음과 같이 복사해보자.

 % bin/hadoop dfs -copyFromLocal /tmp/my.txt /tmp
 % bin/hadoop dfs -ls /tmp
 Found 1 items
 drwxr-xr-x   - edward supergroup        36134204   2012-03-08 19:38 /tmp/my.txt


HDFS로 복사된 데이터는 ls 명령어 또는, 앞서 소개된 fsck 명령어를 통해 다음과 같이 보다 상세한 파일의 상태 및 블록 정보 및 실제 블록 파일 위치 등을 확인 해볼 수 있다.

% bin/hadoop fsck /tmp/my.txt -files -locations -blocks
FSCK started by edward from /192.168.123.198 for path /tmp/my.txt at Mon Mar 26 10:35:35 KST 2012
/tmp/my.txt 36134204 bytes, 1 block(s):  Under replicated blk_-3900174264464062459_1046. Target Replicas is 3 but found 1 replica(s).
0. blk_-3900174264464062459_1046 len=36134204 repl=1 [192.168.123.198:50010]
Status: HEALTHY
 Total size:    36134204 B
 Total dirs:    0
 Total files:   1
 Total blocks (validated):      1 (avg. block size 36134204 B)
 Minimally replicated blocks:   1 (100.0 %)
 Over-replicated blocks:        0 (0.0 %)
 Under-replicated blocks:       1 (100.0 %)
 Mis-replicated blocks:         0 (0.0 %)
 Default replication factor:    3
 Average block replication:     1.0
 Corrupt blocks:                0
 Missing replicas:              2 (200.0 %)
 Number of data-nodes:          1
 Number of racks:               1
FSCK ended at Mon Mar 26 10:35:35 KST 2012 in 1 milliseconds

The filesystem under path '/tmp/my.txt' is HEALTHY

IT crowd

"If you're stuck on programming something, Call BBQ (chicken) store manager for technical details."

This is a joke between korean developers. Who should make the best use of their TALENT and taking full advantage of it?