복붙노트

[HADOOP] mapreduce 작업의 맵 단계 출력은 항상 정렬됩니까?

HADOOP

mapreduce 작업의 맵 단계 출력은 항상 정렬됩니까?

Mapper에서 얻은 결과물과 약간 혼동합니다.

예를 들어,이 입력 텍스트를 사용하여 간단한 단어 계산 프로그램을 실행하면 다음과 같습니다.

hello world
Hadoop programming
mapreduce wordcount
lets see if this works
12345678
hello world
mapreduce wordcount

이것이 내가 얻는 결과입니다 :

12345678    1
Hadoop  1
hello   1
hello   1
if  1
lets    1
mapreduce   1
mapreduce   1
programming 1
see 1
this    1
wordcount   1
wordcount   1
works   1
world   1
world   1

보시다시피 매퍼의 출력은 이미 정렬되어 있습니다. 나는 감속기를 전혀 사용하지 않았다. 하지만 매퍼의 출력이 정렬되지 않은 다른 프로젝트에서 발견됩니다. 그래서 나는 이것에 관해 아주 분명하다.

내 질문은 다음과 같습니다.

해결법

  1. ==============================

    1.아닙니다. 감속기를 사용하지 않으면 분류되지 않습니다. 감속기를 사용하는 경우 매퍼의 출력이 디스크에 기록되기 전에 사전 정렬 프로세스가 있습니다. Reduce 단계에서 데이터가 정렬됩니다. 여기에서 일어나는 일은 단지 추측입니다. 새 API에서는 Identity Reducer를 사용하여 변환되는 Reducer 클래스를 지정하지 않습니다 (이 답변과 설명 참조). Identity Reducer는 입력을 출력합니다. 이를 확인하려면 기본 감속 카운터를 참조하십시오 (작업 감소, 입력 레코드 및 그룹 축소, 출력 레코드 감소 ...)

    아닙니다. 감속기를 사용하지 않으면 분류되지 않습니다. 감속기를 사용하는 경우 매퍼의 출력이 디스크에 기록되기 전에 사전 정렬 프로세스가 있습니다. Reduce 단계에서 데이터가 정렬됩니다. 여기에서 일어나는 일은 단지 추측입니다. 새 API에서는 Identity Reducer를 사용하여 변환되는 Reducer 클래스를 지정하지 않습니다 (이 답변과 설명 참조). Identity Reducer는 입력을 출력합니다. 이를 확인하려면 기본 감속 카운터를 참조하십시오 (작업 감소, 입력 레코드 및 그룹 축소, 출력 레코드 감소 ...)

    앞의 질문에서 설명한 것처럼 축소 기 (reducers)를 사용하지 않으면 매퍼는 데이터를 정렬하지 않습니다. 축소 기 (reducer)를 사용하면 데이터가 맵 단계에서 정렬 된 다음 축소 단계에서 병합 정렬됩니다.

    다시 말하지만, 셔플 및 정렬은 축소 단계의 일부입니다. 신원 감속 기는 당신이 원하는 것을 할 것입니다. 감속기 당 하나의 키 - 값 쌍을 출력하고 값이 반복 가능한 값의 연결 인 경우, iterable을 메모리 (예 : StringBuffer)에 저장 한 다음이 연결을 값으로 출력하면됩니다. reduce 단계를 거치지 않고지도 출력을 프로그램 출력으로 바로 보내려면 드라이버 클래스에서 reduce 작업 수를 0으로 설정하십시오.

    job.setNumReduceTasks(0);
    

    하지만 출력물을 정렬하지는 않습니다. mapper의 사전 정렬 프로세스를 건너 뛰고 출력을 HDFS에 직접 씁니다.

  2. ==============================

    2.포인트 1 : 매퍼의 출력은 항상 정렬되지만 키를 기반으로합니다. 즉, Map 메소드가 이것을 수행하는 경우 : context.write (outKey, outValue); 결과는 outKey를 기준으로 정렬됩니다.

    포인트 1 : 매퍼의 출력은 항상 정렬되지만 키를 기반으로합니다. 즉, Map 메소드가 이것을 수행하는 경우 : context.write (outKey, outValue); 결과는 outKey를 기준으로 정렬됩니다.

  3. ==============================

    3.다음은 질문에 대한 설명입니다.

    다음은 질문에 대한 설명입니다.

  4. ==============================

    4.나는 vefthym의 답을지지한다. 일반적으로 매퍼 출력은 노드에 로컬로 저장되기 전에 정렬됩니다. 그러나 작업 구성에서 numReduceTasks를 0으로 명시 적으로 설정하면 매퍼 o / p는 정렬되지 않고 HDFS에 직접 기록됩니다. 따라서 매퍼 출력은 항상 정렬되어 있다고 말할 수는 없습니다!

    나는 vefthym의 답을지지한다. 일반적으로 매퍼 출력은 노드에 로컬로 저장되기 전에 정렬됩니다. 그러나 작업 구성에서 numReduceTasks를 0으로 명시 적으로 설정하면 매퍼 o / p는 정렬되지 않고 HDFS에 직접 기록됩니다. 따라서 매퍼 출력은 항상 정렬되어 있다고 말할 수는 없습니다!

  5. ==============================

    5.1. 매퍼의 출력물은 항상 정렬되어 있습니까?

    1. 매퍼의 출력물은 항상 정렬되어 있습니까?

    2. 매핑 단계의 출력이 이미 중간 데이터로 정렬되도록 분류 단계가 이미 매퍼 단계에 통합되어 있습니까?

    Apache MapReduce 튜토리얼 :

    (매퍼 (Mapper) 섹션 아래)

    (감속기 섹션 아래)

    3. 정렬 및 셔플 단계에서 데이터를 수집하고 감속기에 들어가기 전에 데이터를 유지하는 방법이 있습니까? 감속기에는 키와 반복 가능 목록이 제공됩니다. 방법이 있습니까,이 데이터를 유지할 수 있습니까?

    나는 그렇게 생각하지 않는다. 감속기에 대한 아파치 비난에서 :

    혼합:

    Reducer는 네트워크를 통해 HTTP를 사용하여 각 매퍼의 정렬 된 출력을 복사합니다.

    종류: 프레임 워크 병합은 Reducer 입력을 키별로 정렬합니다 (다른 매퍼가 동일한 키를 출력 할 수 있기 때문에).

    셔플 및 정렬 단계는 즉, 출력이 병합되는 동안 동시에 발생합니다.

    줄이다:

    reduce 작업의 출력은 일반적으로 TaskInputOutputContext.write (Object, Object)를 통해 RecordWriter에 기록됩니다.

    감속기의 출력은 다시 정렬되지 않습니다.

    설명서에 따라 셔플 및 정렬 단계는 프레임 워크에 의해 유도됩니다.

    데이터를 유지하려면 축소 자 수를 0으로 설정하여 Map 출력이 HDFS로 지속되도록하지만 데이터를 정렬하지 않습니다.

    관련된 SE 질문을보십시오 :

    hadoop : 0 감속기와 신원 감속기의 차이점은 무엇입니까?

    Hadoop 2.x 버전에서 IdentityReducer를 찾지 못했습니다.

    새로운 Hadoop API의 identityreducer

  6. from https://stackoverflow.com/questions/24771006/is-the-output-of-map-phase-of-the-mapreduce-job-always-sorted by cc-by-sa and MIT license