hadoop mapreduce의 새로운 버전 yarn
- Posted at 2011/11/27 19:17
- Filed under project/lucene_hadoop
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를 이해하는 것이 필수라고 할 수 있습니다.
이외에 많은 내용이 있지만 개념만 설명하는 차원이라서 생략하도록 하겠습니다.
Posted by 김형준
- Response
- No Trackback , No Comment







AppendTest.java






