복붙노트

[HADOOP] Hive cluster 대 vs order by vs 정렬 기준

HADOOP

Hive cluster 대 vs order by vs 정렬 기준

내가 이해하는 한도에서는;

그래서 내 질문은 세계 질서를 보장함으로써 클러스터가되는 것인가? 같은 키를 같은 감속기에 넣으면서 분배하지만 인접한 키는 어떨까요?

이 문서에서 찾을 수있는 유일한 문서는 여기에 있으며 예를 들어 전세계에서 주문한 것처럼 보입니다. 그러나 정의에서 나는 항상 그렇게하지 않는다고 생각합니다.

해결법

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

    1.짧은 대답 : 예, CLUSTER BY는 여러 개의 출력 파일을 직접 참여하고자한다면 전 세계적인 주문을 보장합니다.

    짧은 대답 : 예, CLUSTER BY는 여러 개의 출력 파일을 직접 참여하고자한다면 전 세계적인 주문을 보장합니다.

    더 긴 버전 :

    이해가 되니? 따라서 CLUSTER BY는 기본적으로 ORDER BY의 확장 성이 뛰어난 버전입니다.

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

    2.먼저 정리해 보겠습니다. 클러스터 된 키는 다른 버킷에 키를 분배합니다. 버킷을 정렬하여 정렬합니다.

    먼저 정리해 보겠습니다. 클러스터 된 키는 다른 버킷에 키를 분배합니다. 버킷을 정렬하여 정렬합니다.

    간단한 실험 (아래 참조)을 사용하면 기본적으로 전역 순서를 얻지 못한다는 것을 알 수 있습니다. 그 이유는 기본 분할자가 실제 키 순서에 관계없이 해시 코드를 사용하여 키를 분할하기 때문입니다.

    그러나 데이터를 완전히 주문할 수 있습니다.

    동기 부여는 Tom White (제 3 판, 8 장, 274, Total Sort)의 "Hadoop : The Definitive Guide"에서 TotalOrderPartitioner에 대해 설명합니다.

    먼저 TotalOrdering 질문에 답한 다음 내가 수행 한 여러 종류의 하이브 (Hive) 실험을 설명합니다.

    명심하십시오 : 여기서 설명하는 것은 '개념 증명'입니다. Claudera의 CDH3 배포판을 사용하여 단일 예제를 처리 할 수있었습니다.

    원래 org.apache.hadoop.mapred.lib.TotalOrderPartitioner가 트릭을 수행하기를 희망했다. 불행히도 그것은 Hive 파티션이 키가 아닌 값으로 보이기 때문에 발생하지 않았습니다. 그래서 그것을 패치 (서브 클래스가 있어야하지만, 그 시간이 없어) :

    바꾸다

    public int getPartition(K key, V value, int numPartitions) {
        return partitions.findPartition(key);
    }
    

    public int getPartition(K key, V value, int numPartitions) {
        return partitions.findPartition(value);
    }
    

    이제 TotalOrderPartitioner를 하이브 파티셔너로 설정 (패치) 할 수 있습니다 :

    hive> set hive.mapred.partitioner=org.apache.hadoop.mapred.lib.TotalOrderPartitioner;
    
    hive> set total.order.partitioner.natural.order=false
    
    hive> set total.order.partitioner.path=/user/yevgen/out_data2
    

    나는 또한 사용했다.

    hive> set hive.enforce.bucketing = true; 
    
    hive> set mapred.reduce.tasks=4;
    

    내 검사에서.

    File out_data2는 TotalOrderPartitioner에게 버킷 값을 알려줍니다. 데이터를 샘플링하여 out_data2를 생성합니다. 내 테스트에서는 0부터 10까지 4 개의 버킷과 키를 사용했습니다. 임시 방편으로 out_data2를 생성했습니다.

    import org.apache.hadoop.util.ToolRunner;
    import org.apache.hadoop.util.Tool;
    import org.apache.hadoop.conf.Configured;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.hadoop.hive.ql.io.HiveKey;
    import org.apache.hadoop.fs.FileSystem;
    
    
    public class TotalPartitioner extends Configured implements Tool{
        public static void main(String[] args) throws Exception{
                ToolRunner.run(new TotalPartitioner(), args);
        }
    
        @Override
        public int run(String[] args) throws Exception {
            Path partFile = new Path("/home/yevgen/out_data2");
            FileSystem fs = FileSystem.getLocal(getConf());
    
            HiveKey key = new HiveKey();
            NullWritable value = NullWritable.get();
    
            SequenceFile.Writer writer = SequenceFile.createWriter(fs, getConf(), partFile, HiveKey.class, NullWritable.class);
            key.set( new byte[]{1,3}, 0, 2);//partition at 3; 1 came from Hive -- do not know why
            writer.append(key, value);
            key.set( new byte[]{1, 6}, 0, 2);//partition at 6
            writer.append(key, value);
            key.set( new byte[]{1, 9}, 0, 2);//partition at 9
            writer.append(key, value);
            writer.close();
            return 0;
        }
    
    }
    

    그런 다음 결과 out_data2를 HDFS로 복사했습니다 (/ user / yevgen / out_data2)

    이 설정을 사용하여 데이터를 버킷으로 분류 / 분류했습니다 (실험 목록의 마지막 항목 참조).

    여기 내 실험이있다.

    기본적으로이 테이블에는 0에서 9까지의 값이 순서없이 포함됩니다.

    값이 오름차순으로 정렬됨을 알 수 있습니다. CDH3에서 하이브 버그 같은데?

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

    3.CLUSTER BY는 전역 정렬을 생성하지 않습니다.

    CLUSTER BY는 전역 정렬을 생성하지 않습니다.

    허용 된 답 (Lars Yencken)은 감속기가 중첩되지 않는 범위를 수신 할 것이라고 오해합니다. Anton Zaviriukhin은 BucketedTables 문서를 올바르게 지적하므로 CLUSTER BY는 기본적으로 DISTRIBUTE BY (버킷과 동일)와 각 버킷 / 축소 기 내에서 SORT BY입니다. 그리고 DISTRIBUTE BY는 단순히 해시와 버킷으로 개조되며 해싱 함수는 순서 (i> j 인 경우 i> i의 해시의 해시)를 유지하지만 해시 값의 mod는 그렇지 않습니다.

    중복 된 범위를 보여주는 더 좋은 예가 있습니다.

    http://myitlearnings.com/bucketing-in-hive/

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

    4.내가 이해하는 한, 짧은 대답은 아니오입니다. 겹치는 범위가 생길 것입니다.

    내가 이해하는 한, 짧은 대답은 아니오입니다. 겹치는 범위가 생길 것입니다.

    SortBy 문서에서 : "Cluster By는 Distribute By와 Sort By의 지름길입니다." "동일한 분배기 열을 가진 모든 행은 동일한 감속기로 이동합니다." 그러나 중복되지 않는 보증 범위에 의한 배포에 대한 정보는 없습니다.

    또한, DDL BucketedTables 문서에서 : "Hive는 버킷에 행을 어떻게 분산합니까? 일반적으로 버킷 수는 hash_function (bucketing_column) mod num_buckets 표현식에 의해 결정됩니다." 클러스터 바이 바이 셀렉터 (Select by Statement)는 동일한 원칙을 사용하여 리듀서간에 행을 분산한다고 가정합니다. 왜냐하면 주로 버킷이 달린 테이블에 데이터를 채우는 것이기 때문입니다.

    나는 1 개의 정수 열 "a"가있는 테이블을 만들고 거기에 0에서 9까지의 숫자를 삽입했습니다.

    그런 다음 감속기의 수를 2로 설정했습니다. set mapred.reduce.tasks = 2 ;.

    그리고 Cluster by 절을 사용하여이 테이블의 데이터를 선택하십시오. my_tab 클러스터에서 *를 선택하십시오.

    그리고 내가 예상 한 결과를 받았다.

    0
    2
    4
    6
    8
    1
    3
    5
    7
    9
    

    따라서 첫 번째 감속기 (숫자 0)는 짝수가됩니다 (모드 2가 0이기 때문에)

    두 번째 감속기 (숫자 1)는 홀수를 얻습니다 (모드 2가 1이기 때문에)

    이것이 배포자가 작동하는 방식입니다.

    그런 다음 "정렬 기준"은 각 감속기 내부의 결과를 정렬합니다.

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

    5.클러스터는 글로벌이 아닌 감속기별로 정렬합니다. 많은 책에서 그것은 또한 잘못되거나 혼란스럽게 언급됩니다. 특정 부서에서 각 부서를 배포 한 다음 각 부서의 직원 이름별로 정렬하고 사용할 클러스터가없는 부서의 순서는 상관하지 않으며 작업 부하가 감속기 사이에 분산 될 때마다 더 많은 성과를 거둘 수 있다고 말하는 경우에 특히 유용합니다 .

    클러스터는 글로벌이 아닌 감속기별로 정렬합니다. 많은 책에서 그것은 또한 잘못되거나 혼란스럽게 언급됩니다. 특정 부서에서 각 부서를 배포 한 다음 각 부서의 직원 이름별로 정렬하고 사용할 클러스터가없는 부서의 순서는 상관하지 않으며 작업 부하가 감속기 사이에 분산 될 때마다 더 많은 성과를 거둘 수 있다고 말하는 경우에 특히 유용합니다 .

  6. ==============================

    6.SortBy : 범위가 겹치는 N 개 이상의 정렬 된 파일.

    SortBy : 범위가 겹치는 N 개 이상의 정렬 된 파일.

    OrderBy : 단일 출력, 즉 완전히 주문 됨.

    분배 자 : 분배 N 개의 감속기 각각을 보호함으로써 열의 중첩되지 않는 범위를 얻지 만 각 감속기의 출력을 정렬하지는 않습니다.

    자세한 내용은 http://commandstech.com/hive-sortby-vs-orderby-vs-distributeby-vs-clusterby/를 참조하십시오.

    ClusterBy : 위와 같은 예제를 참조하십시오. x로 클러스터를 사용하면 두 축소 기가 x :

  7. ==============================

    7.사용 사례 : 큰 데이터 집합이있을 때 정렬 기준으로 정렬해야합니다. 설정된 모든 축소 지표는 내부적으로 데이터를 분류하여 함께 묶기 전에 성능을 향상시킵니다. Order by에서 큰 데이터 세트의 성능은 모든 데이터가 단일 감속기를 통과하므로로드가 증가하므로 쿼리를 실행하는 데 더 많은 시간이 소요됩니다. 아래의 노드 클러스터 11 예제를 참조하십시오.

    사용 사례 : 큰 데이터 집합이있을 때 정렬 기준으로 정렬해야합니다. 설정된 모든 축소 지표는 내부적으로 데이터를 분류하여 함께 묶기 전에 성능을 향상시킵니다. Order by에서 큰 데이터 세트의 성능은 모든 데이터가 단일 감속기를 통과하므로로드가 증가하므로 쿼리를 실행하는 데 더 많은 시간이 소요됩니다. 아래의 노드 클러스터 11 예제를 참조하십시오.

    이것은 하나의 Order By 예제 출력입니다.

    이 예제는 Sort by Example 출력입니다.

    이 예제는 클러스터 바이 패스입니다.

    내가 관찰 한 것, 분류 기준, 분류 기준 및 분포 기준은 동일하지만 내부 메커니즘이 다릅니다. 분포 형 : 동일한 열 행이 하나의 감속기로 이동합니다 (예 : DISTRIBUTE BY (도시) - 방갈로르 데이터 한 열, 델리 데이터 한 감속기 :

  8. from https://stackoverflow.com/questions/13715044/hive-cluster-by-vs-order-by-vs-sort-by by cc-by-sa and MIT license