답변:
먼저 shuffling
매퍼에서 리듀서로 데이터를 전송하는 과정이므로 리듀서에 필요한 것이 분명하다고 생각합니다. 그렇지 않으면 입력 (또는 모든 매퍼의 입력)을 가질 수 없기 때문입니다. . 시간을 절약하기 위해지도 단계가 완료되기 전에 셔플 링을 시작할 수 있습니다. 그렇기 때문에지도 상태가 아직 100 %가 아닌 경우 감소 상태가 0 %보다 크지 만 (33 % 미만) 볼 수 있습니다.
Sorting
감속기의 시간을 절약하여 새로운 감속 작업이 시작되어야하는시기를 쉽게 구별 할 수 있습니다. 정렬 된 입력 데이터의 다음 키가 이전 키와 다를 때 간단히 새 축소 작업을 시작합니다. 각각의 축소 작업은 키-값 쌍의 목록을 가져 오지만 키-목록 (값) 입력을받는 reduce () 메서드를 호출해야하므로 키별로 값을 그룹화해야합니다. 입력 데이터가 맵 단계에서 (로컬로) 미리 정렬되고 축소 단계에서 단순히 병합 정렬 된 경우 (리듀서가 많은 매퍼로부터 데이터를 가져 오기 때문에) 그렇게하기 쉽습니다.
Partitioning
답변 중 하나에서 언급 한은 다른 프로세스입니다. 지도 단계의 출력 인 (키, 값) 쌍이 전송 될 감속기를 결정합니다. 기본 파티션 도구는 키에 해싱을 사용하여 축소 작업에 배포하지만이를 재정의하고 사용자 지정 파티션 도구를 사용할 수 있습니다.
이러한 단계에 대한 훌륭한 정보 소스는이 Yahoo 자습서 입니다.
이에 대한 멋진 그래픽 표현은 다음과 같습니다 (이 그림에서는 셔플을 "복사"라고 함).
주 shuffling
와 sorting
당신이 제로 감속기를 지정하면 전혀 수행되지 않습니다 (setNumReduceTasks (0)). 그런 다음 MapReduce 작업이지도 단계에서 중지되고지도 단계에는 어떤 종류의 정렬도 포함되지 않으므로지도 단계도 더 빠릅니다.
업데이트 : 더 공식적인 것을 찾고 있기 때문에 Tom White의 책 "Hadoop : The Definitive Guide"를 읽을 수도 있습니다. 여기 에 귀하의 질문에 대한 흥미로운 부분이 있습니다.
Tom White는 2007 년 2 월부터 Apache Hadoop 커미터로 활동하고 있으며 Apache Software Foundation의 회원이므로 꽤 신뢰할 수 있고 공식적인 것 같습니다.
Mapreduce 프로그램의 주요 단계를 다시 살펴 보겠습니다.
지도 단계는 매퍼에 의해 이루어집니다. 매퍼 는 정렬되지 않은 입력 키 / 값 쌍에서 실행됩니다. 각 매퍼는 각 입력 키 / 값 쌍에 대해 0 개, 1 개 또는 여러 개의 출력 키 / 값 쌍을 내 보냅니다.
결합 단계는 결합 장치에 의해 수행된다. 결합기는 동일한 키와 키 / 값 쌍을 결합해야한다. 각 결합기는 0 번, 1 번 또는 여러 번 실행할 수 있습니다.
셔플 및 분류 단계는 프레임 워크에 의해 수행된다. 모든 매퍼의 데이터는 키별로 그룹화되고 리듀서로 분할되며 키별로 정렬됩니다. 각 감속기는 동일한 키와 관련된 모든 값을 얻습니다. 프로그래머는 정렬을위한 사용자 지정 비교 함수와 데이터 분할을위한 파티 셔 너를 제공 할 수 있습니다 .
파티션 프로그램은 감속기가 특정 키 값 쌍을 얻을 것이다 결정합니다.
감속기 얻은, 키 / [값리스트] 쌍이 정렬 키로 정렬. 값 목록에는 매퍼가 생성 한 동일한 키를 가진 모든 값이 포함됩니다. 각 감속기는 각 입력 키 / 값 쌍에 대해 0 개, 1 개 또는 여러 개의 출력 키 / 값 쌍을 방출합니다 .
이 javacodegeeks를 한 번 봐 가지고 기사 마리아 Jurcovicova로하고 mssqltips 더 나은 이해를 위해 다타에 의해 기사
아래는 safaribooksonline 기사 의 이미지입니다.
ie
Reducers 및 Output 아래 의 문자열은 실제로 is
.
위의 답변에서 누락 된 몇 가지 점을 추가하려고 생각했습니다. 여기 에서 가져온이 다이어그램 은 실제로 무슨 일이 일어나고 있는지 명확하게 나타냅니다.
진짜 목적을 다시 말하면
분할 : 처리 부하를 여러 노드 (매퍼)에 분산하여 병렬 처리를 개선하여 전체 처리 시간을 절약합니다.
결합 : 각 매퍼의 출력을 축소합니다. 데이터를 한 노드에서 다른 노드로 이동하는 데 소요되는 시간을 절약 할 수 있습니다.
정렬 (셔플 및 정렬) : 런타임에서 새 감속기를 쉽게 예약 (생성 / 시작) 할 수 있습니다. 정렬 된 항목 목록을 살펴 보는 동안 현재 키가 이전 키와 다를 때마다 새 감속기를 생성 할 수 있습니다. .
매퍼의 출력이 감속기에 대한 입력이므로 항상 이것이 필요하다고 생각했습니다. 따라서 키 스페이스를 기준으로 정렬 한 다음 각 감속기 입력에 대해 버킷으로 분할했습니다. 키의 모든 동일한 값이 동일한 버킷에 들어가 감속기로 이동하여 함께 감소되도록해야합니다. K1, V2 및 K1, V4를 다른 감속기로 보낼 필요가 없습니다. 줄이기 위해 함께 있어야하기 때문입니다.
가능한 한 간단하게 설명해 보았습니다.
MapReduce가 기본적으로 수행하는 작업은 정렬 및 (정렬로 구현 됨) 확장 가능한 GroupBy입니다.
MapReduce를 통한 대부분의 애플리케이션 및 디자인 패턴은 셔플 및 정렬로 제공되는이 두 작업을 통해 빌드됩니다.
음, Mapreduce에는 Mapper 와 Reducer 라는 두 가지 중요한 문구가 있습니다. 모두 너무 중요하지만 Reducer는 필수입니다. 일부 프로그램에서 감속기는 선택 사항입니다. 이제 질문에 오십시오. 셔플 링과 정렬은 Mapreduce에서 중요한 두 가지 작업입니다. 첫 번째 Hadoop 프레임 워크는 구조화 / 비 구조화 데이터를 가져와 데이터를 Key, Value로 분리합니다.
이제 Mapper 프로그램은 데이터를 처리 할 키와 값으로 분리하고 배열합니다. 키 2 및 값 2 값을 생성합니다. 이 값은 원하는 솔루션을 얻기 위해 적절한 순서로 처리하고 다시 정렬해야합니다. 이제이 셔플 및 정렬이 로컬 시스템에서 수행되고 (프레임 워크가 처리합니다) 프로세스 프레임 워크가 로컬 시스템의 데이터를 정리 한 후 로컬 시스템에서 처리됩니다. 확인
여기서는 결합기 와 파티션 을 사용 하여이 셔플 및 정렬 프로세스를 최적화합니다. 적절한 배열 후, 이러한 키 값은 원하는 클라이언트의 출력을 얻기 위해 Reducer로 전달됩니다. 마지막으로 Reducer는 원하는 출력을 얻습니다.
K1, V1-> K2, V2 (프로그램 Mapper 작성),-> K2, V '(여기서는 데이터 셔플 및 소프트)-> K3, V3 출력을 생성합니다. K4, V4.
이 모든 단계는 논리적 인 작업 일뿐 원본 데이터를 변경하지 않습니다.
질문 : Map Reduce Programming의 감속기에서 셔플 링 및 정렬 단계의 목적은 무엇입니까?
짧은 대답 : 원하는 출력을 얻기 위해 데이터를 처리합니다. 셔플 링은 데이터를 집계하고 감소는 예상 출력을 얻습니다.