복붙노트

[HADOOP] 높은 카디널리티 필드에 대한 하이브 쿼리 성능

HADOOP

높은 카디널리티 필드에 대한 하이브 쿼리 성능

나는 거의 항상 기본 키 열 (예 : employee_id)로 쿼리되는 하이브에 하나의 거대한 테이블을 가지고 있습니다. 테이블은 정말 거대 할 것이며, 매일 수백만 개의 행이 삽입되며이 필드를 통해 파티션을 사용하여 빠르게 쿼리하려고합니다. 나는이 게시물을 따라 갔고 파티셔닝이 낮은 카디널리티 필드에만 적합하다는 것을 알고 있으므로 employee_id 열로 빠르게 쿼리하는 목표를 어떻게 달성 할 수 있습니까?

매우 높은 카디널리티를 가진 id 컬럼은 버킷으로 사용되어야하지만 하나의 테이블에 대한 쿼리 성능에는 도움이되지 않는다는 것을 이해합니다.

파티션으로 해시 (employee_id)와 같은 것을 사용할 수 있다면 대단히 도움이 될 것이라고 생각합니다. 이것이 가능한가? 하이브에 관한 문서에서 그런 것을 볼 수 없었습니다.

요약하면 원하는 것은 빠른 쿼리 결과입니다.

select * from employee where employee_id=XXX

직원 테이블에는 기본 키 열 employee_id가있는 수십억 개의 레코드가 있다고 가정합니다. 여기서 연도, 월, 일 등의 클래식 파티셔닝은 도움이되지 않습니다.

미리 감사드립니다.

해결법

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

    1.1) 블룸 필터와 함께 ORC 사용 :

    1) 블룸 필터와 함께 ORC 사용 :

    CREATE TABLE employee (
      employee_id bigint,
      name STRING
    ) STORED AS ORC 
    TBLPROPERTIES ("orc.bloom.filter.columns"="employee_id")
    ;
    

    2) 벡터화를 사용하여 PPD를 활성화하고 CBO 및 Tez를 사용합니다.

    SET hive.optimize.ppd=true;
    SET hive.optimize.ppd.storage=true;
    SET hive.vectorized.execution.enabled=true;
    SET hive.vectorized.execution.reduce.enabled = true;
    SET hive.cbo.enable=true;
    set hive.stats.autogather=true;
    set hive.compute.query.using.stats=true;
    set hive.stats.fetch.partition.stats=true;
    set hive.execution.engine=tez;
    SET hive.stats.fetch.column.stats=true;
    SET hive.tez.auto.reducer.parallelism=true; 
    

    3) 매퍼 (mappers)와 레 듀서 (reducers)에 대해 적절한 병렬 처리를 조정하십시오.

    --example for mappers:
    
        set tez.grouping.max-size=67108864;
        set tez.grouping.min-size=32000000;
    
    
    --example settings for reducers: 
    
        set hive.exec.reducers.bytes.per.reducer=67108864; --decrease this to increase the number of reducers
    

    이러한 수치를 변경하여 최적의 성능을 얻으십시오.

  2. from https://stackoverflow.com/questions/48295667/hive-query-performance-for-high-cardinality-field by cc-by-sa and MIT license