Map Reduce Programming의 감속기에서 셔플 링 및 정렬 단계의 목적은 무엇입니까?


113

Map Reduce 프로그래밍에서 감소 단계에는 하위 부분으로 셔플 링, 정렬 및 감소가 있습니다. 정렬은 비용이 많이 드는 일입니다.

Map Reduce Programming의 감속기에서 셔플 링 및 정렬 단계의 목적은 무엇입니까?


3
매퍼의 출력이 감속기에 대한 입력이므로 항상 이것이 필요하다고 생각했습니다. 따라서 키 스페이스를 기준으로 정렬 한 다음 각 감속기 입력에 대해 버킷으로 분할했습니다.
BasicHorizon 2014 년

답변:


171

먼저 shuffling매퍼에서 리듀서로 데이터를 전송하는 과정이므로 리듀서에 필요한 것이 분명하다고 생각합니다. 그렇지 않으면 입력 (또는 모든 매퍼의 입력)을 가질 수 없기 때문입니다. . 시간을 절약하기 위해지도 단계가 완료되기 전에 셔플 링을 시작할 수 있습니다. 그렇기 때문에지도 상태가 아직 100 %가 아닌 경우 감소 상태가 0 %보다 크지 만 (33 % 미만) 볼 수 있습니다.

Sorting감속기의 시간을 절약하여 새로운 감속 작업이 시작되어야하는시기를 쉽게 구별 할 수 있습니다. 정렬 된 입력 데이터의 다음 키가 이전 키와 다를 때 간단히 새 축소 작업을 시작합니다. 각각의 축소 작업은 키-값 쌍의 목록을 가져 오지만 키-목록 (값) 입력을받는 reduce () 메서드를 호출해야하므로 키별로 값을 그룹화해야합니다. 입력 데이터가 맵 단계에서 (로컬로) 미리 정렬되고 축소 단계에서 단순히 병합 정렬 된 경우 (리듀서가 많은 매퍼로부터 데이터를 가져 오기 때문에) 그렇게하기 쉽습니다.

Partitioning답변 중 하나에서 언급 한은 다른 프로세스입니다. 지도 단계의 출력 인 (키, 값) 쌍이 전송 될 감속기를 결정합니다. 기본 파티션 도구는 키에 해싱을 사용하여 축소 작업에 배포하지만이를 재정의하고 사용자 지정 파티션 도구를 사용할 수 있습니다.

이러한 단계에 대한 훌륭한 정보 소스는이 Yahoo 자습서 입니다.

이에 대한 멋진 그래픽 표현은 다음과 같습니다 (이 그림에서는 셔플을 "복사"라고 함).

여기에 이미지 설명 입력

shufflingsorting당신이 제로 감속기를 지정하면 전혀 수행되지 않습니다 (setNumReduceTasks (0)). 그런 다음 MapReduce 작업이지도 단계에서 중지되고지도 단계에는 어떤 종류의 정렬도 포함되지 않으므로지도 단계도 더 빠릅니다.

업데이트 : 더 공식적인 것을 찾고 있기 때문에 Tom White의 책 "Hadoop : The Definitive Guide"를 읽을 수도 있습니다. 여기 에 귀하의 질문에 대한 흥미로운 부분이 있습니다.
Tom White는 2007 년 2 월부터 Apache Hadoop 커미터로 활동하고 있으며 Apache Software Foundation의 회원이므로 꽤 신뢰할 수 있고 공식적인 것 같습니다.


"정렬은 감속기의 시간을 절약하여 새로운 축소 작업이 시작되어야하는시기를 쉽게 구별 할 수 있도록 도와줍니다. 정렬 된 입력 데이터의 다음 키가 이전 키와 다를 때 간단히 새 축소 작업을 시작합니다." 나는이 부분을 얻지 못한다. 매퍼는 분할기를 사용하여 유출을 로컬로 분할 한 다음 각 분할을 축소로 보냅니다. 여기서 정렬이 어떻게 도움이됩니까?
MaxNevermind

1
@MaxNevermind x reduce 작업 (파티션)이 있다고해서 reduce () 메서드를 x 번 호출한다는 의미는 아닙니다. 모든 고유 키에 대해 한 번 호출됩니다. 따라서 하나의 reduce 작업은 reduce () 메서드를 여러 번 호출 할 수 있습니다.
vefthym

"모든 고유 키에 대해 한 번씩 호출됩니다."이유는 무엇입니까? 매퍼가 원하는 방식으로 파티션을 형성 한 다음 (각 키에 대해 하나의 파티션이 필요하지 않음) 각 파티션이 감속기로 이동합니다. 틀렸나 요?
MaxNevermind

1
@MaxNevermind Mapper는 키와 값을 출력하지만 파티션을 형성하지 않습니다. 파티션은 사용자가 정의하는 축소 작업의 수와 파티션 도구 구현으로 정의됩니다. 동일한 키를 가진 모든 매퍼의 출력은 동일한 reduce () 메서드로 이동합니다. 이것은 변경할 수 없습니다. 그러나 변경할 있는 것은 다른 키 (있는 경우)가 동일한 파티션에 배치되어 동일한 작업에서 처리되는 것입니다. 축소 작업은 reduce () 함수를 두 번 이상 호출 할 수 있지만 모든 키에 대해 한 번만 호출 할 수 있습니다.
vefthym

2
알겠습니다. 내 문제는 reduce가 하나의 키-값 쌍이 아닌 인수로 값 목록을 취하는 것을 잊었다는 것입니다. 나는 당신의 대답에서 이것을 자세히 설명해야한다고 생각합니다. "각 감소 작업은 키-값 쌍의 목록을 가져 오지만 key-List <value>를 사용하는 reduce 메소드를 호출해야하므로 키별로 값을 그룹화해야합니다. 입력 데이터가 매퍼 단계에서 미리 정렬 된 경우 수행 할 작업 "
MaxNevermind 2016-06-30

42

Mapreduce 프로그램의 주요 단계를 다시 살펴 보겠습니다.

지도 단계는 매퍼에 의해 이루어집니다. 매퍼 는 정렬되지 않은 입력 키 / 값 쌍에서 실행됩니다. 각 매퍼는 각 입력 키 / 값 쌍에 대해 0 개, 1 개 또는 여러 개의 출력 키 / 값 쌍을 내 보냅니다.

결합 단계는 결합 장치에 의해 수행된다. 결합기는 동일한 키와 키 / 값 쌍을 결합해야한다. 각 결합기는 0 번, 1 번 또는 여러 번 실행할 수 있습니다.

셔플 및 분류 단계는 프레임 워크에 의해 수행된다. 모든 매퍼의 데이터는 키별로 그룹화되고 리듀서로 분할되며 키별로 정렬됩니다. 각 감속기는 동일한 키와 관련된 모든 값을 얻습니다. 프로그래머는 정렬을위한 사용자 지정 비교 함수와 데이터 분할을위한 파티 셔 너를 제공 할 수 있습니다 .

파티션 프로그램은 감속기가 특정 키 값 쌍을 얻을 것이다 결정합니다.

감속기 얻은, 키 / [값리스트] 쌍이 정렬 키로 정렬. 값 목록에는 매퍼가 생성 한 동일한 키를 가진 모든 값이 포함됩니다. 각 감속기는 각 입력 키 / 값 쌍에 대해 0 개, 1 개 또는 여러 개의 출력 키 / 값 쌍을 방출합니다 .

이 javacodegeeks를 한 번 봐 가지고 기사 마리아 Jurcovicova로하고 mssqltips 더 나은 이해를 위해 다타에 의해 기사

아래는 safaribooksonline 기사 의 이미지입니다.

여기에 이미지 설명 입력


나는 이미지에 오타가 있다고 생각합니다 (제가 여기에 복사되어 있음을 깨닫습니다). ieReducers 및 Output 아래 의 문자열은 실제로 is.
Jeff Evans

32

위의 답변에서 누락 된 몇 가지 점을 추가하려고 생각했습니다. 여기 에서 가져온이 다이어그램 은 실제로 무슨 일이 일어나고 있는지 명확하게 나타냅니다.

여기에 이미지 설명 입력

진짜 목적을 다시 말하면

  • 분할 : 처리 부하를 여러 노드 (매퍼)에 분산하여 병렬 처리를 개선하여 전체 처리 시간을 절약합니다.

  • 결합 : 각 매퍼의 출력을 축소합니다. 데이터를 한 노드에서 다른 노드로 이동하는 데 소요되는 시간을 절약 할 수 있습니다.

  • 정렬 (셔플 및 정렬) : 런타임에서 새 감속기를 쉽게 예약 (생성 / 시작) 할 수 있습니다. 정렬 된 항목 목록을 살펴 보는 동안 현재 키가 이전 키와 다를 때마다 새 감속기를 생성 할 수 있습니다. .


이 그래프에서 파티션 단계는 어디에서 나올까요? 지도 후와 결합 전?
Joel

@Joel '분할'단계를 참조하시기 바랍니다.
Supun Wijerathne

아니요, 파티션 단계를 의미합니다. 기본적으로 간단한 해시 모듈로를 사용하여 데이터를 보낼 리듀서를 결정합니다. 더 많은 조사를 한 후 결합 단계 후, 셔플 및 정렬 전에 발생한다고 생각합니다.
Joel

1
@Joel 설명하려는 내용이 명확하지 않습니다. 요컨대, 정확한 단계 순서는 거의 문제에 따라 다를 수 있습니다. 일부 시나리오에서는 정렬조차 필요하지 않다고 말할 수 있습니다. 귀하의 입력으로 돌아와서 위의 간단한 단어 수 예제에 대해 구체적으로 이야기하면 감속기를 결정하기 위해 그러한 분할이 실제로 필요하지 않습니다. 키당 감소를 생성하는 것은 매우 간단합니다. 그러나 귀하의 요점이 일부 시나리오에 유효 할 수 있다고 생각합니다. 솔직히 저는 그것에 대해 정확히 알지 못합니다.
Supun Wijerathne

4

일부 데이터 처리 요구 사항은 정렬이 전혀 필요하지 않습니다. Syncsort는 Hadoop의 정렬을 플러그 가능하게 만들었습니다. 여기에 정렬에 그들로부터 좋은 블로그입니다. 매퍼에서 감속기로 데이터를 이동하는 과정을 셔플 링이라고 합니다. 이에 대한 자세한 내용은 문서를 확인 하세요 .


2

매퍼의 출력이 감속기에 대한 입력이므로 항상 이것이 필요하다고 생각했습니다. 따라서 키 스페이스를 기준으로 정렬 한 다음 각 감속기 입력에 대해 버킷으로 분할했습니다. 키의 모든 동일한 값이 동일한 버킷에 들어가 감속기로 이동하여 함께 감소되도록해야합니다. K1, V2 및 K1, V4를 다른 감속기로 보낼 필요가 없습니다. 줄이기 위해 함께 있어야하기 때문입니다.

가능한 한 간단하게 설명해 보았습니다.


k1, v1 및 k1, v4를 동일한 감속기로 보내려면 shuffling 할 수 있습니다. 그러면 정렬의 목적은 무엇입니까?
Nithin K Anil 2014 년

여러 가지 이유로 정렬을 수행합니다. 한 가지 이유는 MapReduce 작업이 입력이 정렬되지 않은 경우 모든 KV 쌍을 감속기에 보낼 때 K1, VX의 모든 인스턴스를 선택하려면 모든 Mapper 출력을 스캔해야합니다. . 반면에 Mapper 출력이 K2, VX가 선택 되 자마자 정렬되면 K1, VX가 모두 선택되고 해당 세트를 처리를 위해 감속기로 보낼 수 있다는 것을 알 수 있습니다. 감속기를 시작하려면 모든 감속기가 준비 될 때까지 기다려야합니다.
BasicHorizon 2014 년

또한 집계에 관해서는 감속기가 K2, V2에서 선택하자마자 감속기에 대한 입력이 정렬되면 K1, V1을 모두 집계하도록 지정하면 K1, V1의 인스턴스가 더 이상 존재하지 않는다는 것을 알 수 있습니다. 감속기 입력이 정렬되지 않은 경우는 K1, V1에 대한 전체 입력 스캔해야합니다 반면 그것은 그것의 집계를 완료 할 수 있습니다
BasicHorizon

2

셔플 링은 매퍼의 중간 데이터가 0,1 이상의 감속기로 전송되는 프로세스입니다. 각 감속기는 감속기 수에 따라 하나 이상의 키와 관련 값을받습니다 (균형 부하의 경우). 또한 각 키와 관련된 값이 로컬로 정렬됩니다.


0

MapReduce가 기본적으로 수행하는 작업은 정렬 및 (정렬로 구현 됨) 확장 가능한 GroupBy입니다.

MapReduce를 통한 대부분의 애플리케이션 및 디자인 패턴은 셔플 및 정렬로 제공되는이 두 작업을 통해 빌드됩니다.


0

이것은 좋은 읽기입니다. 도움이 되었기를 바랍니다. 당신이 걱정하는 정렬에 관해서는 Map의 마지막 단계의 병합 작업이라고 생각합니다. 맵 작업이 완료되고 결과를 로컬 디스크에 기록해야하는 경우 버퍼에서 생성 된 분할에 대해 다중 병합이 수행됩니다. 병합 작업의 경우 고급에서 각 파티션을 정렬하는 것이 유용합니다.


0

음, Mapreduce에는 MapperReducer 라는 두 가지 중요한 문구가 있습니다. 모두 너무 중요하지만 Reducer는 필수입니다. 일부 프로그램에서 감속기는 선택 사항입니다. 이제 질문에 오십시오. 셔플 링과 정렬은 Mapreduce에서 중요한 두 가지 작업입니다. 첫 번째 Hadoop 프레임 워크는 구조화 / 비 구조화 데이터를 가져와 데이터를 Key, Value로 분리합니다.

이제 Mapper 프로그램은 데이터를 처리 할 키와 값으로 분리하고 배열합니다. 키 2 및 값 2 값을 생성합니다. 이 값은 원하는 솔루션을 얻기 위해 적절한 순서로 처리하고 다시 정렬해야합니다. 이제이 셔플 및 정렬이 로컬 시스템에서 수행되고 (프레임 워크가 처리합니다) 프로세스 프레임 워크가 로컬 시스템의 데이터를 정리 한 후 로컬 시스템에서 처리됩니다. 확인

여기서는 결합기파티션 을 사용 하여이 셔플 및 정렬 프로세스를 최적화합니다. 적절한 배열 후, 이러한 키 값은 원하는 클라이언트의 출력을 얻기 위해 Reducer로 전달됩니다. 마지막으로 Reducer는 원하는 출력을 얻습니다.

K1, V1-> K2, V2 (프로그램 Mapper 작성),-> K2, V '(여기서는 데이터 셔플 및 소프트)-> K3, V3 출력을 생성합니다. K4, V4.

이 모든 단계는 논리적 인 작업 일뿐 원본 데이터를 변경하지 않습니다.

질문 : Map Reduce Programming의 감속기에서 셔플 링 및 정렬 단계의 목적은 무엇입니까?

짧은 대답 : 원하는 출력을 얻기 위해 데이터를 처리합니다. 셔플 링은 데이터를 집계하고 감소는 예상 출력을 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.