본문 바로가기

Data Engineering

Apache Hive 정리

 

  • Hadoop 위에 구축된 데이터 웨어하우스 시스템
  • Hadoop HDFS에 저장된 대규모 데이터 집합의 요약, 쿼리 및 분석을 단순화함
  • HiveQL이라 불리는 SQL과 유사한 인터페이스를 제공, HDFS, Apache HBase, Amazon S3와 같은 Hadoop과 통합된 다양한 DB와 파일 시스템에 저장된 데이터 쿼리 가능
  • Hive는 명령줄 인터페이스 (CLI), Beeline (JDBC 클라이언트) 또는 Thrift API를 사용하는 응용 프로그램을 통해 쿼리를 실행 가능
  • HiveQL MapReduce, TEZ 등의 작업으로 변환하여 실행

역사

  • SQL Hadoop에서 사용하기 위한 프로젝트로 2010년에 시작됨
  • Hadoop MapReduceJava로 표현하기보다는 익숙한 SQL로써 데이터를 핸들링하는 것이 편하기에 나오게 된 개념

 

 

UI: 사용자가 쿼리 및 기타 작업을 시스템에 제출하는 UI

Driver: 쿼리를 수신하는 구성 요소. 쿼리를 입력 받고 작업을 처리

Compiler: 메타 스토어를 참고하여 쿼리 구문을 분석하고 실행계획을 생성, HiveQL Hadoop 작업으로 변환

Metastore: DB, 테이블, 파티션의 정보를 저장

Execution Engine: 컴파일러에 의해 생성된 실행 계획을 실행, Driver에 반영

 

1. 쿼리 실행: 드라이버와 통신하여  Web UI, Hive CLI 등을 통해 HiveQL을 실행

2. 계획 가져오기: 드라이버는 쿼리를 수락하고, 세션을 생성하며 실행 계획을 가져오기 위해 Hive 컴파일러에 쿼리를 전달

3. 메타데이터 가져오기: Hive 컴파일러는 Hive 메타스토어에 메타데이터 요청을 보냄

4. 메타데이터 보내기: 메타스토어는 메타데이터를 컴파일러로 보냄. 컴파일러는 이 메타데이터를 사용하여 쿼리 트리의 표현식에 대한 유형 검사 및

의미 분석을 수행. 이후 컴파일러는 실행 계획(DAG, Directed Acyclic Graph)을 생성

5. 계획 보내기: 컴파일러는 생성된 실행 계획을 드라이버에 보냄

6~6.3 계획 실행 및 작업 제출:

  • 드라이버는 컴파일러로부터 실행 계획을 받은 후, 계획을 실행하기 위해 실행 계획을 실행 엔진으로 보냄
  • 실행 엔진은 이러한 DAG 단계를 각 구성 요소로 보냄. (MapReduce를 사용한 경우) Mapper / Reducer에 대해 HDFS 파일에서 행을 읽기 위해 Serde (Serializer-Deserializer) Deseriacize가 사용됨
  • 출력이 생성되면 Serde Seriacize를 통해 HDFS 임시 파일에 기록됨, 이후 임시 파일은 계획의 후속 MapReduce 단계에 데이터를 제공하는 데 사용됨.

7~9. 결과 전송 및 저장: 실행 엔진이 드라이버를 통해 HDFS에서 직접 임시 파일의 내용을 읽음. 그후 드라이버는 결과를 Hive 인터페이스로 보낸 후, Execution Engine을 통해 Data Node에 저장

 

커맨드 입력

  • 커맨드 라인에서 바로 입력
    $ hive -e "SELECT * FROM table" --
    옵션을 이용하여 쿼리의 실행 엔진과, 변수를 설정 가능
  • :
    $ hive -e 'SELECT * FROM table WHERE yymmdd=${hivevar:targetDate}'\
       --hiveconf hive.execution.engine=tez \
       --hiveconf tez.queue.name=queue_name \
       --hivevar targetDate=20240101

 

Hive 엔진

  • Engine MR, Tez, Spark 중 하나를 설정하여 사용할 수 있음
  • Hive 2.0 버전부터는 기본적으로 Tez 사용

MR: Map 단계에서 데이터를 읽고 중간 산출물 생성, Reduce 단계에서 중간 산출물을 다시 읽어 처리하고 최종 결과 출력

  •  IO 작업이 빈번히 일어나고, 이에 따라 오버헤드가 발생

TEZ: yarn 기반 데이터 처리를 위한 프레임워크

  • 방향성 비순환 그래프 (DAG)를 사용하기 때문에, SQL 실행 전에 작업량, 리소스에 대해 최적화된 실행 계획 설계 가능
  • 각 스테이지에서 나온 중간 산출물 (Map 단계의 결과물)을 메모리에 저장 후, Reduce 단계로 넘겨 처리하기 때문에 IO가 줄고 속도가 빨라짐
  • HDFS에 읽고 쓰는 불필요한 단계를 감소시킴으로써 기존 MR의 단점을 해결

 

TEZ 메모리 부족 현상 (Out of Memory)

  • MR와 처리 크기 면에선 차이가 없음. 오류가 발생할 시 대체로 메모리 설정으로 해결 가능

 

Tez 메모리 설정 
--------------------------- AM(Application Master) 메모리 -----------------------------

// AM(Application Master)의 메모리
set tez.am.resource.memory.mb=2048;

// AM(Application Master)이 사용할 힙메모리 사이즈(tez.am.resource.memory.mb의 80%)
set tez.am.java.opts=-Xmx1600m;

---------------------------------- container 메모리 ----------------------------------
// tez 작업을 진행하는 컨테이너의 메모리 크기
set hive.tez.container.size=2048;

// 컨테이너에서 사용할 수 있는 힙의 메모리 크기
set hive.tez.java.opts=-Xmx1600m;  // hive.tez.container.size의 80%

// 출력결과를 정렬해야 할 때 사용하는 메모리
set tez.runtime.io.sort.mb=800;    // hive.tez.container.size의 40%

// 맵조인에 사용하는 메모리
set hive.auto.convert.join.noconditionaltask.size=600;  // hive.tez.container.size의 33%

 

Tez 메모리 할당 방식

 

.hql 작성

$ cat sample.hql
SELECT * FROM table WHERE yymmdd=${hivevar:targetDate}--
파일을 이용하여 쿼리 입력
$ hive -f sample.hql --hivevar targetDate=20240101

 

'Data Engineering' 카테고리의 다른 글

Apache Spark 로컬 환경 구성  (0) 2024.03.26
Apache Spark 기본 정리  (0) 2024.03.15