June 17, 2012

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

No comments:

Post a Comment