hadoop mapreduce의 새로운 버전 yarn

지난 글에서 hadoop 파일시스템의 변화에 대해 간단하게 살펴 보았습니다. 이번 글에서는 mapreduce의 변화에 대해 살펴보도록 하겠습니다.
hadoop 0.23 버전에서의 가장 큰 변화는 YARN 이라고 할 수 있습니다. YARN은 Yet Another Resource Negotiator 의 약자라고 합니다. hadoop은 YARN을 통해 분산 환경에서의 애플리케이션 서버로 진화하려는 시도를 하고 있습니다.
0.23 이전 버전의 mapreduce는 분산된 서버에서 안정적으로 map/reduce task를 실행 관리하는 기능을 수행했다면 YARN에서는 분산된 환경에서 다양한 분산 시스템을 운영할 수 있는 환경을 제공하고 있습니다. 그래서 이름에도 Resource 관리라는 개념을 붙였고요. 따라서 hadopo-0.23 에서의 YARN은 MapReduce 뿐만 아니라 사용자가 쉽게(?) 분산된 작업을 만들어서 실행할 수 있는 환경을 제공하고 있습니다. 즉 분산 애플리케이션 서버의 역할을 수행한다고 할 수 있습니다.
지금 버전에서는 다소 기능이 약하지만 지향하는 방향이 그쪽이라서 버전이 올라갈수록 좋아 질것이라 예상해봅니다.

먼저 YARN에서 MapReduce의 시스템 실행을 보면 다음 그림과 같습니다.

사용자 삽입 이미지

YARN은 ResourceManager와 NodeManager 두 종류의 데몬으로 구성되어 있습니다. ResourceManager는 마스터 서버의 역할을 수행하며 1대의 서버에 실행됩니다. NodeManager는 worker 역할을 수행하며 N대의 서버에 실행됩니다.
ResourceManager 내부에는 Scheduler와 ApplicationManager라는 두개의 메인 컴포넌트로 구성되어 있습니다.

  - Scheduler: NodeManager들의 자원 상태를 관리한다. 0.23 버전에서 자원은 NodeManager의 여유 메모리로 관리된다.
  - ApplicationManager: 특정 작업을 위한 Master 서버가 되는 Application Master를 실행하고 Application Master의 상태를 관리한다.

여기서 Application Master라는 새로운 용어가 나오는데 YARN에서 실행되는 하나의 작업을 관리하는 마스터 서버를 Application Master라고 부릅니다. MapReduce 작업의 경우 JobTracker가 Application Master입니다.
YARN의 두 데몬과 각 컴포넌트들이 Map/Reduce 작업을 어떻게 실행하는지 위 그림을 보고 간단하게 설명하겠습니다.

ResourceManager의 Scheduler는 NodeManager로 부터 주기적으로 NodeManager의 상태 정보를 수신하여 가용한 리소스 정보를 관리합니다.
사용자 요청(MapReduce 작업 실행)을 받으면 ResourceManager의 ApplicationManager는 Scheduler에게 ApplicationMaster(JobTracker)를 실행시키기 위한 NodeManager를 할당 받은 후 해당 NodeManager에 JobTracker를 실행을 요청합니다. NodeManager는 JobTracker를 fork하여 실행합니다.
JobTracker는 ResourceManager의 Scheduler에게 TaskTracker 실행을 위한 NodeManager 할당을 요청하여 NodeManager 목록을 받습니다.
각 NodeManager에 TaskTracker 실행을 요청하면 NodeManager는 TaskTracker를 fork하여 실행합니다.
이후 부터는 기존의 MapReduce 작업 실행과 동일하게 JobTracker에 의해 스케줄링되고 작업이 TaskTracker에 할당되고 실행됩니다.
작업이 종료되면 JobTracker, TaskTracker 모두 종료됩니다. 기존 버전에서는 JobTracker, TaskTracker는 종료되지 않고 사용자가 실행시킨 Task만 종료되었는데 YARN에서는 JobTracker/TaskTracker 자체가 사용자가 실행시킨 작업이기 때문에 작업이 종료되면 해당 데몬들은 종료시킵니다.
JobTracker가 종료되면 기존의 작업에 대한 로그 정보들이 유실되는데 이를 위해 JobHistoryServer하는 별도의 데몬이 있습니다. 이 데몬을 실행하면 작업 로그는 이 데몬에 의해 관리되고 이 데몬에서 제공하는 웹 UI를 이용하여 작업 history 정보를 볼 수 있습니다.
이렇게 많이 바뀌었기 때문에 기존의 MapReudce 작업은 실행되지 않을까 걱정할 수 있는데 기존의 Map/Reduce 프로그램도 잘 돌아가게 구성되어 있습니다.

YARN에서는 JobTracker/TaskTracker는 하나의 특화된 작업입니다. 개발자는 MapReduce 프레임워크와 같은 분산된 환경에서 작업을 처리할 수 있는 다양한 시스템을 YARN 에서 실행시킬 수 있습니다. 예를 들어 그래프 분석을 처리하는 GoldenORB나 Hama와 같은 프로그램은 각각 리소스 관리 체계, 데몬 관리, 사용자 작업 분배 처리 등과 같은 분산 작업에 필요한 모듈을 모두 새로 개발해야 했었습니다. 하지만 YARN에서는 이런 기능들은 미리 제공하고 있어 별도의 추가 개발할 필요 없이 실행하고자 하는 로직만 처리하도록 구성할 수 있도록 해줍니다. 물론 YARN 환경에서도 새로운 분산 시스템을 만드는 것도 쉬운 작업은 아닙니다. MapReduce 프레임워크만 보더라도 아직 복잡하게 구성되어 있으니까요... 작업의 제어, 장애 시 재시도 등에 대한 것들을 개발자가 직접 모두 만들어 줘야하는 것은 여전합니다.

그러면 YARN의 장점은 무엇일까요? 아직까지 직접 만들어 보지 못했기 때문에 정확하게 말할 수는 없지만 다음 정도로 정리해 볼 수는 있을 것 같습니다.

 - Application Master에 대한 장애 관리
    제가 본 코드(10월 버전)에서는 아직 이 기능은 들어오지 않았는데 스펙상 지원된다고 하니 정식 버전에는 지원하지 않을까 생각합니다.

 - 분산된 서버의 리소스 관리 및 리소스 할당, 반납
 - 서버(NodeManager)의 장애 상황 감지 및 통보
 - 표준화된 분산 관리 체계 지원으로 정형화된 프로그램 개발 가능 -> 과거에 어렵고 복잡했던 시스템 개발을 표준화된 모습으로 정리 -> 앱스토어 형태의 생태계 구축 가능

현재까지는 이정도 수준입니다.

그리고 0.23의 코드는 거의 새로 만들어진 수준입니다. Map/Reduce 부분의 경우 JobTracker 클래스 자체가 없어졌습니다. 물론 작업의 스케쥴링, TaskTracker의 처리 등내부적으로 Task를 처리하는 기능에 대한 코드는 그대로 사용하고 있습니다.
YARN의 구현은 새로운 개념이기 때문에 모두 새롭게 만들어졌는데 State Machine을 사용하여 데몬, 작업 등의 상태 처리와 이 상태 변환에 따른 로직 구현으로 되어 있기 때문에 각각에 대한 State를 이해하는 것이 필수라고 할 수 있습니다.

이외에 많은 내용이 있지만 개념만 설명하는 차원이라서 생략하도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hadoop-0.23 hdfs block pool 개념

거의 2년만에 hadoop의 새로운 버전이 나올 예정입니다. 중간에 릴리즈된 0.21, 0.22는 호응을 얻지 못하고 바로 0.23 버전으로 올라갈 예정이라고 합니다. 정식 버전은 2012년 2Q 정도나 되어야 나올 것 같네요... 0.23에서는 기존 hadoop 개념에서 많은 내용들이 변경되었고 코드도 많이 바뀌었기 때문에 지금부터 차근차근 준비하는게 좋습니다.
그래서 몇회에 걸쳐 조금씩 정리해볼까 합니다.

첫번째로 먼저 hdfs의 block pool에 대해서 살펴보겠습니다.

사용자 삽입 이미지
(오해의 소지가 있어 그림을 조금 수정했습니다.)
Block Pool 개념은 간단하게 정의하면 DataNode를 Block을 관리하는 데몬으로 사용하고 NameNode는 Block의 메타 정보를 관리하는 데몬 역할을 수행합니다(조금 차이는 있지만 설명을 쉽게 하기 위해). 그리고  DataNode는 하나의  NameNode에만 속하는 것이 아니라 여러 NameNode에 속할 수 있습니다.
각 BlockPool은 하나의 NameNode에만 속할 수 있고  하나의  DataNode에서는 BlockPool 별로 isolation 되어 있어 간섭되지 않는 구조입니다.
그리고 하나의 NameNode에서 관리하는 namespace 영역은 다른 NameNode의 namespace와는 별개로 동작합니다. 즉 통합된 global namespace는 제공되지 않습니다.
이 구조만 보면 NameNode 단위로 볼륨관리를 할 수 있게 하는 기능이 추가되었다고 볼 수 있습니다. 그리고 운영중에 NameNode에 namespace 용량이 모자라면 클러스터 내에 NameNode를 하나 더 실행해서 확장해 나갈 수 있는 방법을 제공하고 있습니다.
하지만 통합된 namespace를 제공하지 않기 때문에 몇개의 NameNode에 있는 디렉토리를 통합해서 보기 위해서는 별도의 프로그램을 구성해야 합니다. 물론 이런 기능도 같이 제공하고 있습니다. 서버단은 아니고 클라이언트 계층에서 ViewFS라는 기능을 이용하여 통합된 뷰로 볼 수 있습니다.

사용자 삽입 이미지

기존 버전 형태로 사용할 경우에는 하나의 NameNode만 실행하면 기존 버전과 동일한 구성으로 실행됩니다.

오늘은 여기까지 입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hive metastore migration

hive 처음 설치할때 metastore로 그냥 기본으로 제공하는 derby 사용하게 되는데 이럴 경우 동시에 여러명이 작업할 수 없는 문제가 있습니다. derby의 경우 기본은 embedded 라서 한명이 접속하면 파일 lock을 잡게 됩니다. m/r 작업이 여러명이 동시에 할 수 없기는 하지만요. ㅋㅋㅋ
여기서 테이블 만들어서 이것저석 테스트 한 후 이제 본격적으로 사용해봐야지라고 할때 보통 metastore를 mysql, oracle과 같은 db를 사용하는데 마이그레이션 방법에 대한 설명입니다.
주의할 점은 테이블 생성 script에 ORDER, DESC와 같은 컬럼명을 사용하고 있는데 이게 reserved word라서 생성된 script에서는 "ORDER" 이런식으로 되어 있습니다. DBMS에 맞게 적절하게 수정해서 사용해야 합니다.

http://search-hadoop.com/m/J15J0FwAg1/v=plain
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hadoop-0.23 화면

삽집끝에 hadoop-0.23 hdfs 하고 yarn 실행했습니다. 성공 기념 관리화면 인증샷

사용자 삽입 이미지

사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hbase 0.90 hadoop append 설정

 hbase 0.90  버전부터는 hadoop의 append 기능을 이용하고 있습니다.  hadoop 0.20 정식 릴리즈 버전에서는 append 기능을 제공하지 않기 때문에 hbase의 lib에 있는 hadoop-core-0.20-append-r1056497.jar 파일로 hadoop의 jar 파일을 대체하여 재시작해야 합니다.
이것 말고 주의해야 할 부분이 하나 더 있는데 append 모드를 사용하기 위해서는 dfs.support.append 설정 값을 true로 설정해야 합니다. 이 설정이 dfs의 설정이다 보니 hadoop의 conf/hdfs-site.xml 파일에만 설정하는 경우가 있는데 이렇게 하면 Configuration 객체가 dfs.support.append 값을 로딩하지 못하여 append 기능을 사용하지 않는 모드로 동작하게 됩니다.
Configuration 클래스의 경우 기본 생성자에서는 core-default.xml, core-site.xml 만 로딩하고 별도로 hdfs-default.xml, hdfs-site.xml, mapred-default.xml, mapred-site.xml 을 로딩하기 위해서는 addResource 메소드를 호출해야 합니다.
hbase 코드 상에서 dfs.support.append 값을 읽어 오기 위해 Configuration 객체를 사용합니다. 따라서 dfs.support.append 값을 인식하게 하기 위해서는  hbase의 conf/hbase-site.xml 파일에 설정하거나 hadoop의 conf/core-site.xml에 설정해야 합니다.
그리고 append 기능 및 sync 기능을 이용한다고 해서 WAL 로그가 sync호출 즉시 hdfs에 반영되는 것은 아닙니다. hadoop-0.20-append 버전에서의 sync 메소드를 호출한다고 해서 hdfs 파일에 바로 반영되는 것은 아닙니다. 이 기능은 hadoop-0.21에 적용되어 있습니다.
hadoop-0.20.append 관련 소스는 hadoop의 common branch에 있습니다. 참고하세요.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hadoop memory usage 모니터링

hadoop을 수년간 운영해왔지만 hadoop monitoring metrics 데이터를 자세하게 보지는 않았습니다. 특정 서버 장애는 서비스 운영에 크게 문제가 되지 않았기 때문이죠. 최근 파일이 많아지고 사용량이 많아지면서 일부 서버에 장애가 지속적으로 발생하여 계속 모니터링 해보고 있습니다.
cloumon-enterprise를 이용해서 메모리 상황을 모니터링 해 보았습니다. namenode 쪽은 파일으 급격하게 증가하지는 않기 때문에 안정적인 패턴을 보이고 있습니다.
현재 File, Block 갯수는 4백만개 정도 됩니다. 아래 그림에서 보듯이 600 ~ 700 MB 정도 사용하고 있습니다.

[그림] namenode heap usage
사용자 삽입 이미지
DataNode 쪽은 메모리에 대해서는 별로 신경쓰지 않았는데 cloumon 적용하면서 확인해보니 의외로 많이 사용하고 있었습니다. 아마 블럭 정보를 메모리에 모두 올려 관리하기 때문이 아닌가 생각합니다.
첫번째 그림의 DataNode는 블럭을 50만개 정도 가지고 있는 서버이고 두번째 서버는 13만개 블럭을 가지고 있는 서버입니다. 메모리 사용량은 500MB, 200MB 정도입니다.

[그림] datanode heap usage(50만개 블럭)
사용자 삽입 이미지
[그림] datanode heap usage(13만개 블럭)
사용자 삽입 이미지
* 모니터링 그림은 cloumon에서 제공하는 화면을 이용하였습니다.
http://www.slideshare.net/gruter/cloumon-enterprise-8463593

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hadoop 0.21 append 성능 테스트

hadoop이 지난달 0.21로 업그레이드 되면 append 기능이 추가되었습니다.
append에 대해 성능 테스트를 수행해 보았는데 결과 공유합니다.

테스트를 수행한 환경이 VM환경이라 절대적인 성능 수치 보다는 일반 write와 속도 비교가 더 의미 있을 겁니다. 그리고 부하 상황이 아닌 싱글 클라이언트 상황에서의 테스트입니다.

1. 테스트 환경
    . 물리적 서버 3대,   각 서버에 VM5대
    . Hadoop 1 master, 23 datanode
    . Hadoop 버전: 0.21

2. 테스트 프로그램
    . 1024 bytes를 102,400번 수행 -> 100MB
    . 별첨 참고

3. 테스트 결과
    . write(BufferedOutputStream 사용시): 17,654 ms
    . write(DFSOutputStream 사용시): 12,298 ms
    . append(DFSOutputStream 사용시, 매번 flush 호출): 130,436 ms
    . append(DFSOutputStream 사용시, 마지막에 flush 호출): 11,398 ms
   . append(DFSOutputStream 사용시, 1000건 단위로 flush 호출): 16,225 ms
 
4. 결론
    . append의 경우 flush()를 호출하지 않으면 기존 write의 동일한 성능
    . append 연산을 사용하는 용도가 주로 로그 데이터 저장 등인데 이 경우 매번 flush 해주는 경우가 일반적
      -> 이런 상황에서는 10배 정도의 성능 저하 발생
    . append 도중 close를 하지 않은 상태에서 클라이언트가 강제 종료되면 일전 시간(수 분) 내에서는
      파일 읽기 연산 불가

    . append 사용 가능 상황
      -> 쓰기 시간이 중요하지 않고 중요한 데이터
      -> 쓰기 시간이 중요하지만 일부 데이터(1000건 정도) 유실이 발생해도 무방한 데이터


크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


hadoop의 DataNode 버그

Hadoop의 DataNode에서 여러개의 볼륨을 사용할 경우 하나의 볼륨에만 문제가 있어도 데이터 노드 자체가 죽어버려 정상적인 디스크에 있는 데이터까지 모두 복구 작업이 진행된다. 소스를 보니 다음 코드처럼 구현되어 있으니 당연히... /* Check if there is no disk space and if so, handle the error*/ protected void checkDiskError( ) throws IOException { try { data.checkDataDir(); } catch(DiskErrorException de) { handleDiskError(de.getMessage()); } } private void handleDiskError(String errMsgr) { LOG.warn("DataNode is shutting down.\n" + errMsgr); shouldRun = false; try { namenode.errorReport( dnRegistration, DatanodeProtocol.DISK_ERROR, errMsgr); } catch(IOException ignored) { } }
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


왕 삽질 후에 성공한 hicc 화면

HICC(Hadoop Infrastructure Care Center)는 chukwa의 서브 모듈로 탑재 되어 있으며 하둡 클러스터를 모니터링 하는 화면을 제공한다.
지난번에 한번 실패하고 이번에 다시 도전해서 성공... 지난번에도 성공헀었는데 화면단에서 조회 조건에서 GMT+0 기준으로 데이터 조회하고 있는 바람에 데이터가 나타나지 않았다는 ㅋㅋㅋ

사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Hadoop NameNode 이중화 해결?

아래 기사 내용중에 자체적으로 해결했다고 되어있습니다.

http://in.sys-con.com/node/1323620

Appistry explains that the native HDFS architecture is built around a single metadata repository called the NameNode and because the NameNode isn't easily clustered, it represents a single point of failure and a bottleneck for the entire system. CloudIQ Storage fixes that limitation.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


« Previous : 1 : 2 : 3 : 4 : 5 : ... 12 : Next »