2012-08-22 5 views
6

모든 감속기에 특정 레코드를 보내려면 어떻게해야합니까?Hadoop이 모든 감속기에 기록을 보냅니다.

저는 Partitioner 클래스와 그 기능을 알고 있지만 레코드가 모든 축소기에 사용되는지 확인하는 쉬운 방법은 없습니다.

기본적으로 파티션 설정이 방법이 있습니다 매퍼는 기록을 줄일 수와 동일한 수 차례 출력 유지 : 다음과 같이 내 첫번째 생각은 협업 파티션 설정과 매퍼을 가지고 있었다

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

작업과 Partitioner는 모든 int (0에서 numPartitions-1까지)를 반환합니다. 이렇게하면 레코드가 모든 파티션에 도달합니다.

이 문제를 해결하는 더 현명한 방법이 있습니까? 예를 들어, 모든 파티션으로 보내야하는 레코드에 대해 -1을 반환하고 반환 된 -1을 볼 때 프레임 워크가이를 수행합니다.

답변

5

분할자가 그렇게 작동하지 않습니다. 이 작업은 키 (일반적으로)와 값 (드물게)을보고 어떤 쌍이 감속기를 보내야하는지 결정하는 것입니다. 이것은 매퍼 (mapper)와 감속기 앞에서 발생합니다.

대신 매퍼 (mapper)는 전체 축소 자 (파티션) 수에 응답 할 수있는 구성을 컨텍스트에 요청할 수 있어야합니다. 그런 다음 매퍼는 원하는 실제 키와 파티션 번호로 구성된 복잡한 키를 출력 할 수 있습니다. 매퍼가 감속기의 수를 알아낼 수 있기 때문에 이것을 써야 할 때가 몇 번 있는지 알 것입니다 (위 참조). 모든 분할자가 수행해야하는 것은 복합 키 값을 분석하고 대상 감속기 색인을 추출한 다음 해당 색인을 리턴하는 것입니다.

그런데이 기술을 사용하여 계산 중에 나중에 사용할 수있는 메타 데이터 (다른 데이터)를 보내려면 실제 데이터 키가 동일한 복합체를 따라야한다는 것을 의미합니다 체재. 사실 복합 키에 키/값 쌍의 종류 (예 : 1 = 실제 데이터, 0 = 메타 데이터 처리)를 나타내는 표시기를 포함시켜야 할 것입니다.

+0

또한 필자가 필요로하는 그룹 비교기와 관련하여이 대답을 업데이트해야합니다. –

+0

이것은 내가 생각했던 방식이다. 필자는이를 매우 명확하게 설명하지 않았고 Partitioner 객체에있는 카운터가 반환해야하는 다음 파티션이 무엇인지 계속 추적하려고 생각했습니다. 그러나 Partitioner 개체가 GC로 처리되고 카운터가 재설정 될 수 있기 때문에 이것이 해결책이라고 확신하지 못합니다. 그룹화 비교기에 대해서는 설명하지 않은 요구 사항에 따라 달라지는 것 같습니다. 필요한 경우 다시 올게요. 감사합니다. – Razvan

관련 문제