빅데이터/그 외

[빅데이터] Impala & Hive & Sqoop

min_min_ 2022. 8. 2. 09:37

HIVE 아키텍처

https://wonyong-jang.github.io/hadoop/2021/05/26/Hadoop-Apache-Hive.html

 

Impala 원리

Impala는 크게 Impalad(daemon)과 statestore로 이루어져있다. 

Hive는 MapReduce 엔진을 사용하는 반면에 Impala는 응답 시간을 최소한으로 줄이기 위해 자체 분산 질의엔진을 사용한다. 이 분산 질의 엔진은 클러스터 내 모든 데이터 노드에 설치되어 있다. 

Impalad 구성

Query Planner : Query를 구문 분석하고, 메타스토어의 Table 및 Partition 정보를 활용하여 실행플랜을 생성합니다.
Query Coordinator : 다른 node에 요청 보내고, 요청 수집
Query Exec Engine : 질의와 메타데이터를 전달받은 모든 impalad는 각자 처리할 데이터 블록을 로컬 디렉터리에서 읽어와 질의 처리를 수행한다. 
각각의 Impalad는 metadata 가지고 있다.

각 Impalad는 각자의 node에 있는 데이터에 대해 수행하기 때문에 data locality, direct read를 하게된다. n/w부하 최소라는 장점이 있다.

CatalogService : Hive에서 DB 변경 있을 시 Impalad의 metadata 반영위해 statestore에 브로드캐스팅 요청. 
Catalog Service가 가지고 있는 Metadata 관리는 실제로 HMS에서 관리하는 데이터를 복사한것

REFRESH나 INVALIDATE METADATA 할 필요 없다

StateStore : 
1) meta의 변경사항을 모든 Impalad에 브로드캐스트
2) Impalad healthcheck

 

Memory 부족

MEM_LIMIT 옵션 혹은 CFM 동적 resource pool 할당에서 계정당 memory 할당 제한둔다.

 

Compute stats

각 테이블 행 수, 관련된 모든 컬럼과 파티션의 볼륨 및 분포도 정보를 수집한다. 파일 개수, 칼럼 최대/최소 값, 평균 값, 

수집한 정보는 메타스토어 데이터베이스에 저장되고, 쿼리 최적화에 사용된다. 파티션된 테이블에 대해 특정 파티션의 정보만 수집하려면 COMPUTE INCREMENTAL STATS PARTITION_NAME 실행한다.
해당 부분처럼 진행하면 얼마나 compute stats때문에 최적화 되었는지 확인 가능하다.
explain 쿼리
compute stats 테이블
explain 쿼리


예제 참고)

https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_perf_stats.html#perf_table_stats
https://datalibrary.tistory.com/108

 

[Impala] 임팔라 쿼리 실행계획을 예제를 통해서 확인하기

안녕하세요. 이번 시간에는 Impala의 실행계획에 대해서 살펴보도록 하겠습니다. 임팔라의 실행계획은 확인하고 싶은 쿼리의 앞에 EXPLAIN 명령을 붙여서 쿼리를 직접 실행하지 않고 실행계획을 확

datalibrary.tistory.com

Sqoop

주요 성능 포인트는 병렬성인 num-mappers 옵션이다. deafult는 4개이고, 원리리는 카디널리티가(중복 적은) 기본키를 사용하면 좋다. 기본적으로는 pk기준으로 하게되는데 그게 없다면 split-by옵션으로 지정할 수 있다.
예를 들어 4개의 MAP 태스크로 import 하고, id의 min max가 0,1000이라고 하면
다음과 같은 4개의 쿼리가 나가게된다.

SELECT * FROM sometable WHERE id >= 0 AND id < 250
SELECT * FROM sometable WHERE id >= 250 AND id < 500
SELECT * FROM sometable WHERE id >= 500 AND id < 750
SELECT * FROM sometable WHERE id >= 750 AND id < 1001

boundary-query란 min,max 값 기준으로 map task를 나누게 되는데 전체를 dump하면 속도가 느릴 수 있기 때문에 다음과 같이 작성한다.

sqoop import \ 
--driver "com.mysql.jdbc.Driver" \ 
--connect "jdbc:mysql://hereis.dbcluster.path:port/a_dbname" \ 
--table "a_table" \ 
--delete-target-dir \ 
--target-dir "hdfs://hereis/hdfs/etl/a_dbname/a_table" \ 
--as-parquetfile \ 
--username "XXXX" \ 
--password "XXXX" \ 
--split-by "user_id" \
--num-mappers "16" \
--split-by id \
--boundary-query "select min(id), max(id) from table"