2012-03-21 2 views
2

나는 매우 큰 양의 데이터에 대해 최대 32 개의 감속기를 사용하여 hadoop 작업을 실행하려고합니다. 그러나 각 감속기의 출력을 보면 하나 이상의 감속기가 다른 값을 가진 키를 얻는 것을 볼 수 있습니다. 더 많은 감속기를 사용하는 동안이 문제를 피할 수 있습니까?Hadoop은 키를 여러 감속기 풀로 분할합니까?

LE : 텍스트 클래스를 대신 사용해 보았습니다.하지만 문제는 정상적으로 작동하지만 힙 공간이 부족하여 결국 jvm이 충돌한다는 것입니다. compareTo와는 다른 키 풀로 데이터를 분할하기 위해 hadoop이 사용하는 기준은 무엇입니까?

답변

7

당신은, 당신이 (WritableComparable를 구현) 사용자 정의 키가 말을 당신은 hashCode() 방법을 재정의?

기본값 인 HashPartitioner를 사용하고 있고 사용자 지정 키에서 hashCode() 메서드를 재정의하지 않은 경우 다른 매퍼의 두 개의 동일한 키가 서로 다른 축소기에 표시됩니다. hashCode()는 키/값 쌍을 전송할 감속기를 결정하기 위해 감속기의 수를 모듈화 한 것입니다.)이는 기본적으로 hashCode() 메서드가 기본이며 객체의 메모리에 주소를 반환하기 때문입니다.

키의 간단한 hashCode 구현은 튜플 필드의 해시 코드를 함께 추가하는 것처럼 간단 할 수 있습니다 필드는 네이티브가 아닌 해시 코드 구현 자체)이 : 나는 추측 실행 해제하지만 여전히 행운을 설정 한 또한 전 0.95에서 감속기를 시작하기위한 임계 값을 설정 한

public int hashCode() { 
    return field1.hashCode() + field2.hashCode() 
} 
5

나는 당신이보고있는 것이 투기 적 실행이라고 생각합니다. 일반적으로 주어진 키의 모든 값은 항상 정확하게 하나의 감속기로 이동합니다. http://developer.yahoo.com/hadoop/tutorial/module4.html에서 :

투기 실행 : 하나는 하둡 시스템에 문제가 약간 느린 노드 속도 제한을하는 프로그램의 나머지 부분을 여러 노드에 작업을 나누어 것이 가능하다는 것이다. 예를 들어 하나의 노드에 느린 디스크 컨트롤러가있는 노드가있는 경우 다른 노드의 속도의 10 % 만 입력하면됩니다. 따라서 99 개의 맵 작업이 이미 일 때 시스템은 최종 맵 작업이 을 확인하기를 기다리고 있으며 다른 모든 노드보다 훨씬 오래 걸립니다.

작업을 서로 독립적으로 실행하면 개별 작업은 입력의 출처를 알 수 없습니다. 작업은 Hadoop 플랫폼이 적절한 입력 만 제공하도록 신뢰합니다. 따라서 동일한 입력을 병렬로 여러 번 처리하여 시스템 기능 차이 인 을 이용할 수 있습니다. 작업의 대부분이 으로 끝나기 때문에 Hadoop 플랫폼은 작업이 수행되지 않는 여러 노드에서 나머지 작업 중 중복 된 사본 을 예약합니다. 이 프로세스는 추측 실행이라고합니다. 작업이 완료되면이 사실을 JobTracker에 알립니다. 작업이 완료되면 먼저 복사본이 최종 복사본이됩니다. 다른 사본이 추측 적으로 실행 중이면 Hadoop은 TaskTrackers에게 에게 작업을 포기하고 출력을 무시하도록 지시합니다. Reducers는 매퍼가 성공적으로 완료 한 후부터 입력을 받게됩니다.

투기 실행은 기본적으로 사용됩니다. mapred.map.tasks.speculative.execution 및 mapred.reduce.tasks.speculative.execution JobConf 옵션을 각각 false로 설정하여 맵퍼 및 리듀서에 대해 투기 실행 을 비활성화 할 수 있습니다.

+0

을, 그들은 여전히 ​​여러 풀을 얻을. – skyel

+0

맞춤형 비교 측정기를 사용하고 있습니까? 여러 감속기가 동일한 열쇠를 얻고 있음을 어떻게 알 수 있습니까? –

+0

필자는 키가 필요한 튜플이기 때문에 필자는 필자의 필자에게 writeableComparable 클래스를 구현하고 compareTo의 튜플에있는 각 문자열을 비교한다. 모든 감속기는 출력에서 ​​한 줄만 출력하고 동일한 감속기 출력 파일에 걸쳐 같은 줄의 사본을 가지고 있습니다. – skyel

관련 문제