복붙노트

[HADOOP] Hadoop 정렬 입력 순서

HADOOP

Hadoop 정렬 입력 순서

내 작업에 대한 입력이 파일 세트 [a, b, c, d] 인 경우, 정렬에 대한 입력은 [map (a.0), map (a.1), map (b.0), map (a.0) b.1),지도 (c.0),지도 (c.1),지도 (d.0),지도 (d.1)]?

내 동기 부여는 일련의 파일 (물론 블록으로 나뉘어 질 것입니다)에 행이 [key, value] 인 것입니다. 여기서 키와 값은 각각 간단한 문자열입니다. 명시적인 주문 정의 필드가 아니더라도 입력에 표시된 순서대로 키마다 감속기에서이 값을 연결하고자합니다.

어떤 조언을 많이 주셔서 감사합니다; 이것은 Google에게 어려운 검색어로 판명되었습니다.

입력 형식

A First
A Another
A Third
B First
C First
C Another

원하는 출력

A First,Another,Third
B First
C First,Another

다시 말하면, 파일이 별도의 블록에 저장되어있는 경우 정확한 순서로 First-Third를 사용할 수 있는지 여부는 확실하지 않습니다.

해결법

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

    1.아니요, Hadoop의 표준 데이터 흐름 (즉, 표준 분류기, 분할 자, 그루퍼)을 사용하여 값이 그 순서대로 유지된다는 보장이 없습니다. 보장되는 유일한 것은 키 (A, B, C)의 순서입니다.

    아니요, Hadoop의 표준 데이터 흐름 (즉, 표준 분류기, 분할 자, 그루퍼)을 사용하여 값이 그 순서대로 유지된다는 보장이 없습니다. 보장되는 유일한 것은 키 (A, B, C)의 순서입니다.

    당신이 원하는 것을 얻기 위해서 당신은 자신 만의 분류기를 작성해야하고, 키에 값 (첫째, 둘째, 셋째)을 포함해야합니다. => 새로운 키는 다음과 같습니다 :

      "A First"
      "A Second"
      ...
    

    그러나이 경우 문제는이 키가 다른 파티션에서 종료된다는 것입니다 (표준 해시 파티셔너가 "첫 번째"를 한 파티션에, "두 번째"를 다른 파티션에 배포 할 가능성이 큽니다). 따라서이 문제를 피하려면 당신은 또한 키의 첫 번째 부분 (즉, A) 만 사용하여 파티션을 할 수있는 자신의 파티션을 연결해야합니다. 또한 그루퍼를 정의해야합니다. 그렇지 않으면 "첫 번째", "두 번째"는 같은 줄이기 호출에 함께 전달되지 않습니다.

    따라서지도 함수의 출력은 다음과 같아야합니다.

     "A First"    First
     "A Second"   Second
     ...
    

    즉, 매퍼가 출력 한 값은 그대로 출력해야합니다. 그렇지 않으면 감속기에서 값을 가져올 수 없습니다.

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

    2.이 문제에 대한 한 가지 해결책은 파일에서 TextInputFormat의 바이트 오프셋을 복합 키의 일부로 사용하고 보조 정렬을 사용하여 값이 축소기에 순서대로 전송되는지 확인하는 것입니다. 그렇게하면 감속기가 입력 한 내용이 파일의 순서대로 원하는 키로 분할되는지 확인할 수 있습니다. 입력 파일이 여러 개인 경우이 새로운 방법은 바이트 파일을 새로 만들 때마다 작동하지 않습니다.

    이 문제에 대한 한 가지 해결책은 파일에서 TextInputFormat의 바이트 오프셋을 복합 키의 일부로 사용하고 보조 정렬을 사용하여 값이 축소기에 순서대로 전송되는지 확인하는 것입니다. 그렇게하면 감속기가 입력 한 내용이 파일의 순서대로 원하는 키로 분할되는지 확인할 수 있습니다. 입력 파일이 여러 개인 경우이 새로운 방법은 바이트 파일을 새로 만들 때마다 작동하지 않습니다.

    스트리밍 API를 사용하면 -inputformat TextInputFormat -D stream.map.input.ignoreKey = false를 작업에 전달하여 실제로 바이트 오프셋을 키로 가져와야합니다. 기본적으로 PipeMapper는 다음과 같은 경우 키를 제공하지 않습니다. if inputformat은 TextInputFormat 플래그입니다. 명시 적으로 TextInputFormat 플래그를 설정하여 추가 ignoreKey 플래그를 설정해야하는 경우에도 마찬가지입니다.

    매퍼에서 여러 개의 키를 내보내는 경우 다음 플래그를 설정하여 출력이 첫 번째 키에서 분할되고 감속기에서 첫 번째와 두 번째로 정렬되도록하십시오.

    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
    -D stream.num.map.output.key.fields=2
    -D mapred.text.key.partitioner.options="-k1,1"
    -D mapred.output.key.comparator.class="org.apache.hadoop.mapred.lib.KeyFieldBasedComparator"
    -D mapreduce.partition.keycomparator.options="-k1 -k2n"
    
  3. from https://stackoverflow.com/questions/11468482/hadoop-sort-input-order by cc-by-sa and MIT license