2009-09-30 3 views
2

시스템의 정지를 얻으려면 hadoop에 작은 테스트 응용 프로그램을 빌드하는 방법에 대해 생각하고 있습니다.감속기에 보내기 전에 값을 정렬하십시오.

내가 염두에두고있는 응용 프로그램은 통계 작업의 영역에 있습니다. 필자는 감속기 기능 (일부 키의 경우 엄청난 수의 값을 가질 수 있음)에서 "각 키에 대한 10 가지 최악의 값"을 원합니다.

내 감속기에 들어가는 값은 기본적으로 "실제 값"과 "실제 값의 품질/관련성"의 조합입니다. 관련성을 토대로 필자는 단순히 "최악의/최악의 10 가지 값을 감속기에서 출력하고 싶습니다.

특정 키에 대해 많은 수의 값이 있다고 가정하면 어떻게해야합니까? 감속기로 보내기 전에 모든 값을 정렬 할 수있는 방법이 있습니까 (아니면 처음 10 개를 읽었을 때 입력 읽기를 중지하십시오)? 아니면 다르게 수행해야합니까?

여기 누군가 나를 볼 수있는 예제 코드 조각을 가르쳐 줄 수 있습니까?


업데이트 : 나는이 흥미로운 락스는 HADOOP-485HADOOP-686 문제 발견했다.

누구나 Hadoop 0.20 API에서이 코드를 사용하는 방법에 대한 코드 조각이 있습니까?

답변

1

당신이 감속기에 보내기 전에지도 측에서 작성한 값으로 무엇을 할지를 정의하는 결합기를 사용하려는 것처럼 들리지만, 키로 그룹화 된 후에는 소리가납니다. 콤 바이 너는 종종 감속기 클래스로 설정됩니다 (지도 측을 축소하고 다시 축소면을 축소).

부분 카운트를 미리 계산하기 단어 수의 예는 결합기를 사용하는 방법에 대해 살펴 보자

http://wiki.apache.org/hadoop/WordCount


업데이트 을 여기에 내가 당신의 문제에 대한 생각하고있는거야; 당신이하려는 것을 오해 한 것일 수도 있습니다.

모든 매퍼는 <key, {score, data}> 쌍을 내 보냅니다.

combiner는 <key, [set of {score, data}>의 부분 집합을 가져오고 (여전히 매퍼 노드에있는) 로컬 정렬을 수행하고 <key, [sorted set of top 10 local {score, data}]> 쌍을 출력합니다.

감속기는 <key, [set of top-10-sets]>이됩니다. 값 집합의 각 구성원에 대해 sort-merge (정렬 필요 없음)의 병합 단계를 수행하고 처음 10 개의 값을 가져올 때 병합을 중지하면됩니다 .


갱신 그래서 2

, 지금 우리가 cumilative하며 결과 순위, 당신은 결합기를 사용하여 초기 데이터를 필터링 할 수 없음을 알고있는 유일한 것은 무엇을해야하는 것입니다 당신은 제안했습니다 - 2 차 정렬을하십시오. 너는 적당한 표를 발견했다; src/examples/org/apache/hadoop/examples/SecondarySort의 Hadoop 20에서이를 수행하는 방법의 예가있다.java (또는 전체 소스 트리를 다운로드하지 않으려는 경우 https://issues.apache.org/jira/browse/HADOOP-4545의 예제 패치를 참조하십시오.)

+0

흠, 지금까지의 내가 결합기가 '특정 노드에서 실행되는 부분 감속기'하기위한 것입니다 이해. 그 시점의 값에 대한 총 "품질"을 모르기 때문에 그 순간에 결과를자를 수 없습니다. –

+0

업데이트 : 흥미로운 제안. 이렇게하면 (잘린 부분 집합을 결합 함) 일반적으로 '정확히'수행하는 것과는 다른 출력을 얻게됩니다. 그리고 그것은 내 상황에 충분할 수도 있습니다. 나는 그것을 고려할 것이다. 감사. –

+0

이것이 다른 결과를 가져올 수있는 이유를 설명해 주시겠습니까? 전 세계적으로 상위 10 개 항목이 각 파티션의 상위 10 개 항목에 포함되어 있다고 생각합니다 (상위 3 개, 상위 2 개, 상위 3 개 - 가능하지만 여기에 있음). – SquareCog

4

소리는 확실히 SecondarySortProblem과 유사합니다. 원하는 경우 "Hadoop : 최종 가이드"를 살펴보십시오. 오라일리 출신이야. 온라인으로 액세스 할 수도 있습니다. 거기에서 그들은 꽤 좋은 구현을 설명합니다.

혼자서도 구현했습니다. 기본적으로이 방법으로 작동합니다 : 파티셔너는 동일한 키가 하나의 단일 감속기로가는 모든 키 - 값 쌍을 관리합니다. 여기에는 특별한 것이 없습니다. 그러나 그룹화를 구성하는 GroupingComparator도 있습니다. 하나의 그룹은 실제로 하나의 reduce() 호출에 반복자로 전달됩니다. 따라서 파티션에는 여러 개의 그룹이 포함될 수 있습니다. 그러나 칸막이의 양은 감속기의 수와 같아야합니다. 그러나 그룹핑을 사용하면 compareTo 메소드를 구현할 때 정렬 작업을 수행 할 수도 있습니다.

이 방법을 사용하면 10 개의 최상위/최악의/최고/최저 키가 감속기에 먼저 도달하도록 제어 할 수 있습니다. 따라서이 10 개의 키를 읽은 후에는 더 이상 반복하지 않고 reduce 메소드를 종료 할 수 있습니다.

도움이 :-)

했다 희망