hadoop에서의 Task 스케쥴링(1)
- Posted at 2007/04/10 15:56
- Filed under project/lucene_hadoop
hadoop에서는 하나의 Job이 여러개의 Task로 분리되어 각 node에서 수행된다.
이때 하나의 Node에 부하가 발생할 경우 Job을 종료할 수 없게 된다. 예를 들어 10개의 컴퓨팅 노드가 있고 각 노드에서 수행되어야 할 Task가 4개인 경우 9개 노드에서는 정상적으로 수행되었지만 나머지 한 노드에 다른 부하로 인해 작업이 계속 진행중인 경우가 발생할 수 있다. 이때 분산컴퓨팅의 일반적인 방법은 마지막 노드에서 수행중이던 Task를 다른 노드로 이관하여 실행시키는 방법이다.
물론 hadoop에서도 이것이 구현되어 있다. hadoop에서는 위와 같은 극단적인 경우가 아닌 일반적인 상황에 대해 Task에 대한 이관이 구현되어 있다. Task 관리는 다음과 같은 방법으로 처리된다.
1. JobTracker는 Job의 평균 진행상황을 유지하고 있다. 각 Task의 진행상황은 RecordReader의 getProgress() 메소드에서 반환되는 값을 이용한다.
2. JobTracker는 TaskTracker로 부터 heartbeat를 전송받으면 각 TaskTracker에서 수행하고 있는 Task의 Status 정보를 분석한다.
3. Status 정보에서 현재의 진행상황과 이전에 받은 진행상황을 비교한다. 진행상황의 변화가 없거나 전체 평균 진행상황보다 20% 이상 낮고, 1분 이상 진행된 Task의 경우 JabTracker는 다른 Node에 Task를 하나 더 생성시킨다.
4. 기존 Task를 KILL 시켜야 하지만 현재 버전(0.12)에서는 Kill되지 않는다. Kill되지 않아도 JobTracker는 먼저 끝나는 Task를 정상 종료시키고 해당 Task에서 수행된 결과만 사용하도록 구현되어 있다.
관련코드는 TaskInProgress 클래스의 다음 부분을 참고한다.
이때 하나의 Node에 부하가 발생할 경우 Job을 종료할 수 없게 된다. 예를 들어 10개의 컴퓨팅 노드가 있고 각 노드에서 수행되어야 할 Task가 4개인 경우 9개 노드에서는 정상적으로 수행되었지만 나머지 한 노드에 다른 부하로 인해 작업이 계속 진행중인 경우가 발생할 수 있다. 이때 분산컴퓨팅의 일반적인 방법은 마지막 노드에서 수행중이던 Task를 다른 노드로 이관하여 실행시키는 방법이다.
물론 hadoop에서도 이것이 구현되어 있다. hadoop에서는 위와 같은 극단적인 경우가 아닌 일반적인 상황에 대해 Task에 대한 이관이 구현되어 있다. Task 관리는 다음과 같은 방법으로 처리된다.
1. JobTracker는 Job의 평균 진행상황을 유지하고 있다. 각 Task의 진행상황은 RecordReader의 getProgress() 메소드에서 반환되는 값을 이용한다.
2. JobTracker는 TaskTracker로 부터 heartbeat를 전송받으면 각 TaskTracker에서 수행하고 있는 Task의 Status 정보를 분석한다.
3. Status 정보에서 현재의 진행상황과 이전에 받은 진행상황을 비교한다. 진행상황의 변화가 없거나 전체 평균 진행상황보다 20% 이상 낮고, 1분 이상 진행된 Task의 경우 JabTracker는 다른 Node에 Task를 하나 더 생성시킨다.
4. 기존 Task를 KILL 시켜야 하지만 현재 버전(0.12)에서는 Kill되지 않는다. Kill되지 않아도 JobTracker는 먼저 끝나는 Task를 정상 종료시키고 해당 Task에서 수행된 결과만 사용하도록 구현되어 있다.
관련코드는 TaskInProgress 클래스의 다음 부분을 참고한다.
class TaskInProgress {
static final int MAX_TASK_EXECS = 1;
static final int MAX_TASK_FAILURES = 4;
static final double SPECULATIVE_GAP = 0.2;
static final long SPECULATIVE_LAG = 60 * 1000;
boolean
hasSpeculativeTask(double averageProgress) {
if( activeTasks.size() <= MAX_TASK_EXECS &&
runSpeculative &&
(averageProgress - progress >= SPECULATIVE_GAP) &&
(System.currentTimeMillis()
- startTime >= SPECULATIVE_LAG)
&& completes == 0) {
return true;
}
return false;
}
Posted by 김형준
- Response
- No Trackback , No Comment
Trackback URL : http://www.jaso.co.kr/trackback/158






