[빅데이터] Impala & Hive & Sqoop
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"