본문으로 바로가기
반응형

Client가 맵리듀스를 수행하면 Job이 생성되고 잡트래커와 태스크트래커에 잡을 할당합니다.

할당된 잡은 각각의 데이터노드에서 수행되어 결과를 반환하며, 최종적으로 수행이 완료 됩니다.


이번에는 각 단계별로 수행되는 단계를 좀 자세히 알아봅니다.

이글은 "시작하세요! 하둡 프로그래밍"을 참고하였습니다.

대부분의 내용이 생략되고 정리된 내용이므로 자세한 내용은 꼭 책을 구입하여 확인하시기 바랍니다.


Client의 Job 요청

1. 앞선 예제에서 main 클래스 내부에서 Job을 생성하여 각종 정보를 set한 후에 waitForCompletion()을 호출합니다.
이 함수가 호출되면 Client의 요청은 Job 내부의 JobClient 컴포넌트에 전달됩니다.

2. JobClient는 RPC를 통해서 잡트래커의 getNewJobId()를 호출 합니다. 잡트래커는 출력 파일 경로에 문제가 없다면 ID를 발급합니다.

3. 클라이언트는 트래커와 태스크트래커에게 정보를 공유하기 위해 HDFS에 하기 정보를 복사합니다.
 - 입력 스플릿 정보
 - JobConf에 설정된 정보
 - 잡 클래스 파일이 포함되 Jar 파일

4. JobClient -> JobTracker의 submitJob()을 호출하여 잡을 실행요청합니다. 

JobTracker의 초기화

1. 잡트래커는 JobInProgress를 생성하고 Job의 상태와 progress를 모니터링 합니다. 또한 split 정보를 이용하여 맵태스크의 개수와 리듀스 태스크 개수를 계산합니다.

2. JobInProgress 내부 queue에 job이 등록되고 스케쥴러가 이 job을 수행합니다.

Scheduler의 Job 할당

맵리듀스는 아래와 같은 스케줄러를 제공합니다.
  • JobQueueTaskScheduler (FIFO 방식) - 기본 스케줄러
  • FairScheduler (Pool 방식)
  • CapacityScheduler (다중 Queue 방식)
세가지 모두 TaskScheduler를 상속받아 구현되어 있습니다.

1. JobTracker는 3초 간격으로 TaskTracker로부터 Heartbeat를 전달받아 상태를 체크합니다.

2. Scheduler는 Queue에서 Job을 선택합니다.

3. Job에서 Task를 선택합니다. (MapTask or ReduceTask)

4.  - MapTask : inputSplit과 동일 서버의 Task 또는 차선으로 동일랙에 있는 task를 할당합니다. (로컬디스크 사용을 위해)
     - ReduceTask: 어차피 네트워크로 데이터를 전달받기 때문에 Task list의 상단부터 차례로 선택횝니다.

5. JobTracker는 Heartbeat의 응답으로 보내는 HeartbeatResponse에 태스트 실행 요청으 담아서 보냅니다.

TaskTracker의 동작

Job 요청을 수신받으면 TaskTracker는 새로운 JVM(Child JVM) 을 실행 합니다. 이 JVM은 Job이 끝난 이후에 재사용 할 수 도 있습니다.

1. 태스크트래커의 TaskLauncher는 HeartbeatReponse에서 응답을 꺼내 TaskInProcess를 생성합니다. (상태와 진행과정을 모니터링하기 위함)

2. TaskInProgress는 실행결과를 저장할 로컬 디렉토리 생성후 jar를 풉니다.

3. TaskInProcess -> TaskRunner에게 task 실행을 요청합니다.

4. TaskRunner -> JvmManager에게 Child Jvm에게 태스트 실행을 요청합니다.

5. Child Jvm은 진행과정을 주기적으로 TaskInProcess에게 알려줍니다.

6. 사용자가 override한 mapper 나 Reducer 클래스가 수행됩니다.


Job의 완료

1. 태스크 트래커는 Job 완료 메시지를 Heartbeat에 담아서 보냅니다.

2. JobTracker는 전체 Task가 완료될때까지 기다린 후 status를 SUCCEEDED로 변경합니다.

3. JobClient는 getJobStatus 메서드로 계속 상태를 확인하다가 SUCCEEDED로 바뀌면 클라이언트에게 전달합니다.

4. 클라이언트는 최종 결과를 출력하고, 잡을 종료합니다.



반응형