2014-12-22 3 views
0

Hadoop 파티셔너에 대해 물어보고 싶습니다. Mappers에서 구현 되었습니까? 기본 해시 분할자를 사용하여 성능을 측정하는 방법 - 데이터 왜곡을 줄이는 데 더 나은 분할자가 있습니까?Hadoop partitioner

감사합니다.

답변

2

파티션이 매퍼에 없습니다.

  • 각지도 태스크는 원형 버퍼 메모리의 출력을 기록한다 (그리고 디스크) - 이하

    각 매퍼에서 발생하는 프로세스이다. 버퍼가 임계 값에 도달하면 백그라운드 스레드가 내용을 디스크에 유출하기 시작합니다. [버퍼 크기는 mapreduce.task.io.sort.mb 속성에 의해 규율됩니다. &의 기본값은 100MB이며 mapreduce.io.sort.spill.percent 속성에 의해 제어됩니다. &의 기본값은 0.08 또는 80 %입니다.] 디스크에 유출 전에 데이터는 & 전송을 작성하는 그들은 각 종류의 결과에
  • 실행 결합기 기능 (적은 데이터를 수 있도록 각 파티션 내에서 키 수행합니다 메모리 종류에 전송 될 감속기이 요구에 대응하는 분할 구체적으로 수행)
  • 압축 (선택 사항) [mapred.compress.map.output = true; mapred.map.output.compression.codec = CodecName]
  • 디스크에 쓰기 및 출력 파일의 파티션은 HTTP를 통해 감속기에서 사용할 수 있습니다. 다음은

이 일어나는 과정 각 감속기

  • 이제 각 감속기가 정렬로 이동, 각 매퍼에서 모든 파일을 수집/상 (일종의 이미 매퍼 측에서 수행)을 병합 정렬 순서를 유지하면서 모든 맵 출력을 병합합니다.

  • 감축 단계에서 감소 된 기능이 정렬 된 출력의 각 키에 대해 호출됩니다. 이하

    enter image description here

키의 파티션의 실제 프로세스를 나타내는 코드이다. getpartition()은 해시 코드에 따라 특정 키가 보내야하는 파티션 번호/감속기를 반환합니다. Hashcode는 각 키에 대해 고유해야하며 가로로는 해시 코드가 고유해야하며 키에는 동일해야합니다. 이를 위해 hadoop은 자바 기본 해쉬 코드를 사용하는 대신 키에 대해 자체 Hashcode를 구현합니다.

Partition keys by their hashCode(). 

     public class HashPartitioner<K, V> extends Partitioner<K, V> { 
     public int getPartition(K key, V value, 
           int numReduceTasks) { 
      return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
     } 

     } 
2

Partitioner는 Mappers와 Reducers 사이의 핵심 구성 요소입니다. 그것은 방출 된지도를 Reducers 사이에 분배합니다.

파티션 작업자는 모든 맵 작업 JVM (Java 프로세스) 내에서 실행됩니다.

기본 분할 자 HashPartitioner은 해시 기능을 기반으로 작동하며 TotalOrderPartitioner과 같은 다른 분할 자와 비교할 때 매우 빠릅니다. 모든지도 출력 키에 대해 해시 함수를 실행합니다.:

Reduce_Number = (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 

해시 파티셔너의 성능을 확인하려면 작업 카운터 줄이기를 사용하고 환원제가 배포판에서 어떻게 발생했는지 확인하십시오.

해시 파티션은 기본 파티셔이며 높은 왜곡이있는 데이터를 처리하는 데 적합하지 않습니다.

데이터 비대칭 문제를 해결하려면 MapReduce API에서 Partitioner.java 클래스를 확장하는 맞춤형 파티션 클래스를 작성해야합니다.

사용자 정의 분할 자의 예는 RandomPartitioner입니다. 이것은 감속기 사이에 기울어 진 데이터를 고르게 분배하는 가장 좋은 방법 중 하나입니다.

관련 문제