[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.많은 질문!, 나는 모두에게 대답하려고 노력하고 몇 가지 성능 팁을 제공합니다 :
많은 질문!, 나는 모두에게 대답하려고 노력하고 몇 가지 성능 팁을 제공합니다 :
데이터는 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)에 제공됩니다.
이제 쿼리 속도를 높이기위한 몇 가지 팁이 있습니다.
from https://stackoverflow.com/questions/30074734/tuning-hive-queries-that-uses-underlying-hbase-table by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] HIVE에서 Date Series를 생성하는 방법은 무엇입니까? (테이블 만들기) (0) | 2019.07.10 |
---|---|
[HADOOP] 파일 이름 + 오프셋을 포함하도록 SequenceFileInputFormat 확장 (0) | 2019.07.10 |
[HADOOP] PIG UDF에서 디버깅 (0) | 2019.07.10 |
[HADOOP] YARN에 배포 할 때 Apache Spark에서 시스템 오류를 처리하는 방법은 무엇입니까? (0) | 2019.07.10 |
[HADOOP] Hadoop에서는 프레임 워크가 Map 작업의 출력을 일반 Map-Reduce 응용 프로그램에 저장합니까? (0) | 2019.07.10 |