복붙노트

[HADOOP] 기본 HBase 테이블을 사용하는 튜닝 하이브 쿼리

HADOOP

기본 HBase 테이블을 사용하는 튜닝 하이브 쿼리

Hbase에 테이블이 있는데 "tbl"이라고 말하면 다음과 같이 쿼리하고 싶습니다. 하이브. 따라서 다음과 같이 테이블을 하이브에 매핑했습니다.

CREATE EXTERNAL TABLE tbl(id string, data map<string,string>)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:")
TBLPROPERTIES("hbase.table.name" = "tbl");

검색어는 다음과 같습니다.

select * from tbl", "select id from tbl", "select id, data
from tbl

정말 빠릅니다.

하지만 검색어는

select id from tbl where substr(id, 0, 5) = "12345"

select id from tbl where data["777"] IS NOT NULL 

엄청나게 천천히.

반대로 Hbase 셸에서 실행할 때 :

"scan 'tbl', {
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or
"scan 'tbl', { COLUMNS=>'data', "FILTER" =>
FilterList.new([qualifierFilter('777')])}"

그것은 번개이다!

jobtracker I에서 하이브가 생성 한 맵핑 된 작업을 살펴 ​​보았을 때 "map.input.records"가 Hbase 테이블의 모든 항목을 계산한다는 것을 발견했습니다. 이는 심지어 모든 매퍼를 시작하기 전에 작업이 전체 테이블 스캔을한다는 것을 의미합니다! 또한, 그것은 Hbase 테이블에서 모든 데이터를 hdfs로 복사하는 것으로 의심됩니다. executuion 전에 mapper tmp 입력 폴더.

그래서, 내 질문은 - 왜 하이브에 대한 hbase 스토리지 처리기가 번역되지 않습니다 적절한 hbase 함수에 하이브 쿼리? 모든 레코드를 스캔하는 이유 그런 다음 "where"절을 사용하여 슬라이스합니까? 어떻게 개선 될 수 있습니까?

Hive 쿼리 (HBase 테이블에 매핑 됨)의 성능을 향상시키기위한 제안 사항.

HBase 테이블에서 보조 인덱스를 만들 수 있습니까?

우리는 HBase와 Hive 통합을 사용하고 Hive 쿼리의 성능을 조정하려고합니다.

해결법

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

    1.많은 질문!, 나는 모두에게 대답하려고 노력하고 몇 가지 성능 팁을 제공합니다 :

    많은 질문!, 나는 모두에게 대답하려고 노력하고 몇 가지 성능 팁을 제공합니다 :

    데이터는 HDFS로 복사되지 않지만 HIVE에 의해 생성 된 맵 축소 작업은 중간 데이터를 HDFS에 저장합니다.

    보조 인덱스 또는 대체 쿼리 경로는 HBase에서 지원하지 않습니다 (추가 정보).

    하이브는 Hbase 셸의 간단한 SCAN 작업이 Hive 쿼리보다 빠르지 만 큰 데이터 집합에서 작업을 배포하는 등 매우 적은 수의 행을 가질 수 있다면 모든 것을 분산 및 초기화 할 시간이 필요한 MapReduce 작업으로 변환합니다 데이터 노드 사이에 반드시 있어야합니다.

    Hive HBase 처리기는 쿼리에서 시작 및 종료 행 키를 추출 할 때 substr (id, 0, 5) = "12345"와 같은 쿼리는 시작 및 중지 행 키를 사용하지 않습니다.

    쿼리를 실행하기 전에 EXPLAIN [your_query]; 명령을 실행하고 filterExpr : part를 확인하십시오. 찾지 못하면 쿼리가 전체 테이블 스캔을 수행합니다. 부가 메모에서 Filter Operator 내의 모든 expresion은 적절한 필터로 변환됩니다.

    EXPLAIN SELECT * FROM tbl WHERE (id>='12345') AND (id<'12346')
    STAGE PLANS:
      Stage: Stage-1
        Map Reduce
          Alias -> Map Operator Tree:
            tbl 
              TableScan
                alias: tbl 
                filterExpr:
                    expr: ((id>= '12345') and (id < '12346'))
                    type: boolean
                Filter Operator
                    ....
    

    다행스럽게도 행 키 접두어를 찾을 때 substr (id, 0, 5) = "12345"를 간단한 쿼리로 변환하면 행 키 시작 및 중지를 쉽게 확인할 수 있습니다. id> = "12345"AND id ""12346 "이면 처리기가이를 감지하고 시작 및 종료 행 키가 스캔 (12345, 12346)에 제공됩니다.

    이제 쿼리 속도를 높이기위한 몇 가지 팁이 있습니다.

  2. from https://stackoverflow.com/questions/30074734/tuning-hive-queries-that-uses-underlying-hbase-table by cc-by-sa and MIT license