[algorithm] MapReduce 정렬 알고리즘은 어떻게 작동합니까?

MapReduce의 성능을 입증하는 데 사용되는 주요 예 중 하나는 Terasort 벤치 마크 입니다. MapReduce 환경에서 사용되는 정렬 알고리즘의 기본 사항을 이해하는 데 어려움이 있습니다.

나에게 정렬은 단순히 다른 모든 요소와의 관계에서 요소의 상대적 위치를 결정하는 것을 포함합니다. 따라서 정렬에는 “모든 것”과 “모든 것”을 비교하는 것이 포함됩니다. 평균 정렬 알고리즘 (빠른, 거품 등)은이를 현명한 방식으로 수행합니다.

내 생각에 데이터 세트를 여러 조각으로 분할한다는 것은 단일 조각을 정렬 할 수 있다는 의미이며, 그런 다음 이러한 조각을 ‘완전한’완전히 정렬 된 데이터 세트에 통합해야한다는 것을 의미합니다. 수천 대의 시스템에 분산 된 테라 바이트 데이터 세트를 감안할 때 이것은 엄청난 작업이 될 것으로 예상합니다.

그렇다면 이것이 실제로 어떻게 이루어 집니까? 이 MapReduce 정렬 알고리즘은 어떻게 작동합니까?

이해하도록 도와 주셔서 감사합니다.



답변

Terasort 에 대한 Hadoop의 구현에 대한 세부 정보는 다음과 같습니다 .

TeraSort는 각 감소에 대한 키 범위를 정의하는 N-1 샘플링 된 키의 정렬 된 목록을 사용하는 사용자 지정 파티 셔 너를 제외하고 표준 맵 / 축소 정렬입니다. 특히, sample [i-1] <= key <sample [i]와 같은 모든 키는 i를 줄이기 위해 전송됩니다. 이것은 reduce i의 출력이 reduce i + 1의 출력보다 모두 작다는 것을 보장합니다. “

따라서 그들의 트릭은지도 단계에서 키를 결정하는 방식에 있습니다. 기본적으로 단일 감속기의 모든 값이 다른 모든 감속기에 대해 ‘사전 정렬’되도록 보장합니다.

James Hamilton의 Blog Post를 통해 논문 참조를 찾았습니다 .


답변

Google 참조 : MapReduce : 대규모 클러스터에서 단순화 된 데이터 처리

출연 :
OSDI’04 : 운영 체제 설계 및 구현에 관한 여섯 번째 심포지엄,
캘리포니아 샌프란시스코, 2004 년 12 월

해당 링크에는 PDF 및 HTML 슬라이드 참조가 있습니다.

설명이 있는 Wikipedia 페이지 도 있습니다.구현 참조가 이 .

또한 비판,

병렬 데이터베이스의 선구적인 전문가이자 아키텍처를 공유하지 않은 David DeWitt와 Michael Stonebraker는 MapReduce가 사용할 수있는 문제의 폭에 대해 논란이 많은 주장을했습니다. 그들은 인터페이스를 너무 낮은 수준이라고 불렀고 그것이 실제로 지지자들이 주장한 패러다임 전환을 나타내는 지 의문을 제기했습니다. 그들은 20 년 넘게 존재 해 온 선행 기술의 예로서 Teradata를 인용하면서 MapReduce 지지자들의 참신함 주장에 이의를 제기합니다. 그들은 MapReduce 프로그래머를 Codasyl 프로그래머와 비교하여 둘 다 “저수준 레코드 조작을 수행하는 저수준 언어로 작성”하고 있다고 지적했습니다. MapReduce의 입력 파일 사용 및 스키마 지원 부족은 B- 트리 및 해시 파티셔닝과 같은 일반적인 데이터베이스 시스템 기능으로 가능해진 성능 향상을 방지합니다.


답변

Google의 MapReduce 논문을 읽는 동안 동일한 질문이있었습니다. @Yuval F대답 내 퍼즐을 거의 해결했습니다.

논문을 읽는 동안 내가 알아 차린 한 가지는 파티셔닝 (맵 후, 축소 전)에서 마법이 발생한다는 것입니다.

종이 사용 hash(key) mod R 파티셔닝 예제로 사용하지만 중간 데이터를 다른 감소 작업으로 파티셔닝하는 유일한 방법은 아닙니다.

@Yuval F답변 에 경계 조건을 추가 하여 완료하면됩니다. min (S) 및 max (S)가 샘플링 된 키 중 최소 키와 최대 키라고 가정합니다. 모든 키 <min (S)는 하나의 축소 작업으로 분할됩니다. 반대로 모든 키> = max (S)는 하나의 축소 작업으로 분할됩니다.

최소 또는 최대와 같이 샘플링 된 키에는 엄격한 제한이 없습니다. 단지, 이러한 R 키가 모든 키에 더 균등하게 분산되고,이 분산 시스템이 더 “병렬”되고, 감소 연산자가 메모리 오버 플로우 문제를 가질 가능성이 적습니다.


답변

그냥 추측 …

방대한 데이터 세트가 주어지면 데이터를 병렬로 처리 할 청크로 분할 할 수 있습니다 (예 : 레코드 번호, 즉 레코드 1-1000 = 파티션 1 등).

클러스터의 특정 노드에 각 파티션을 할당 / 예약합니다.

각 클러스터 노드는 키 알파벳 순서에 따라 파티션을 자체 미니 파티션으로 추가 분할 (매핑)합니다. 따라서 파티션 1에서 A로 시작하는 모든 것을 가져와 x의 미니 파티션 A로 출력하십시오. 현재 A (x)가 이미있는 경우 새 A (x)를 만듭니다. x를 순차 번호로 바꿉니다 (아마도 이것이 수행하는 스케줄러 작업입니다). 즉, 다음 A (x) 고유 ID를 제공합니다.

매퍼 (이전 단계)가 완료 한 작업을 “감소”클러스터 노드로 넘깁니다 (예약). 노드 클러스터를 줄이면 매퍼 작업이 완료되었을 때만 발생하는 각 A (x) 부분의 종류를 더욱 세분화합니다 (아직 가능성이 아직있을 때 A로 시작하는 모든 단어를 실제로 정렬 할 수는 없습니다. 또 다른 A 미니 파티션이 될 것입니다). 최종 정렬 된 부분 (예 : Sorted-A, Sorted-B 등)에 결과를 출력합니다.

완료되면 정렬 된 파티션을 다시 단일 데이터 세트로 결합합니다. 이 시점에서 그것은 단지 n 개의 파일의 단순한 연결 일뿐입니다 (여기서 A-Z 만하고 있다면 n은 26 일 수 있습니다).

중간 단계가있을 수 있습니다 … 잘 모르겠습니다. :). 즉, 초기 축소 단계 후에 추가 매핑 및 축소합니다.


답변