Provisioning, Hive - Docker

Jeonghak Cho·2025년 10월 12일

Provisioning

목록 보기
43/44

Hive 개요

Apache Hive는 본래 대용량 데이터를 SQL 형태로 분석할 수 있도록 만들어진 데이터 웨어하우스 솔루션이다.
하지만 오늘날의 데이터 레이크/레이크하우스 환경에서는 “실제 스토리지보다 메타데이터 레이어” 로서의 가치가 더 커졌다.

요소역할설명
Hive Metastore메타데이터 저장소테이블 스키마, 위치, 파티션 정보, 파일 포맷 등을 저장. Spark, Trino, Presto 등 다양한 엔진이 공유
HiveQLSQL 인터페이스하둡 위에서 SQL로 데이터를 질의할 수 있는 인터페이스 (단, 현재는 다른 쿼리 엔진으로 대체되는 경우 많음)
Hive Execution (MapReduce/Tez)실행 엔진과거에는 쿼리 실행도 Hive가 담당했으나 현재는 Spark/Trino 등으로 대체되는 추세
HDFS기본 스토리지전통적으로 Hive는 HDFS를 기반으로 데이터 레이크를 구성했음

레이크 하우스 전환 이전의 역할

레이크하우스 전환 전 단계에서는 Hive가 아래와 같은 전통적인 아키텍처의 중심 허브 역할을 한다.

[Kafka] ─▶ [Spark ETL] ─▶ [HDFS] ─▶ [Hive Metastore] ─▶ [Hive / Presto / Trino Query]
  • 데이터 스토리지 계층: HDFS (또는 일부 오브젝트 스토리지)
  • 메타스토어 계층: Hive Metastore (RDBMS 기반)
  • 컴퓨팅/쿼리 계층: Hive 자체 또는 Presto/Trino/Spark
  • BI/분석 계층: Tableau, Superset, Looker 등

Hive가 없으면 HDFS에 저장된 Parquet/ORC 파일의 위치와 파티션을 개별적으로 관리해야 하므로, 운영 복잡도가 급격히 증가한다. Hive Metastore는 이 복잡성을 추상화하는 핵심 축입니다.

MinIO 도입(레이크하우스 전환) 시 Hive의 역할 변화

MinIO와 Iceberg/Delta 같은 Lakehouse 포맷을 도입하면 Hive의 기존 역할 중 일부가 대체되거나 축소된다.

기존 Hive 역할MinIO + Iceberg 이후 변화
HDFS 기반 스토리지 관리MinIO (S3 호환 오브젝트 스토리지)로 전환
메타스토어 중심 파티션 관리Iceberg 자체 메타 구조 및 카탈로그(Polaris, Glue, HMS 등)로 대체 가능
HiveQL 실행Spark/Trino/Presto 엔진으로 완전히 대체
데이터 최적화 기능Iceberg의 Snapshot, Partition Evolution, Metadata Layer가 역할을 흡수

Hive를 여전히 사용하는 이유는 Trino, Spark, Iceberg 모두 HMS를 기본 카탈로그로 지원하고, 기존 Hive 테이블 또는 이관 대상 테이블이 여전히 운영 중인 경우가 많으며,
Iceberg Catalog의 백엔드로 HMS를 그대로 사용할 수 있기 때문이다. 즉 Hive는 “실행 주체”에서 “카탈로그 제공자”로 역할이 축소·변형되는 형태로 많이 쓰인다.

Hive 설치

네트워크 생성

docker network create mynetwork

hive-site.xml

hdfs 경로가 입력되어야 한다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property>
        <name>hive.server2.enable.doAs</name>
        <value>false</value>
    </property>
    <property>
        <name>hive.tez.exec.inplace.progress</name>
        <value>false</value>
    </property>
    <property>
        <name>hive.exec.scratchdir</name>
        <value>/opt/hive/scratch_dir</value>
    </property>
    <property>
        <name>hive.user.install.directory</name>
        <value>/opt/hive/install_dir</value>
    </property>
    <property>
        <name>tez.runtime.optimize.local.fetch</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.exec.submit.local.task.via.child</name>
        <value>false</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>local</value>
    </property>
    <property>
        <name>tez.local.mode</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.execution.engine</name>
        <value>tez</value>
    </property>
    <property>
        <name>metastore.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>file:/opt/hive/warehouse</value>
    </property>
</configuration>

이 설정은 “분산 클러스터 없이, 단일 Docker 컨테이너 안에서 Hive를 로컬 Tez 모드로 실행하기 위한 최소 설정”이다.

  • HDFS나 YARN이 없어도 Hive 쿼리 실행 가능
  • 모든 파일은 /opt/hive/warehouse 등 로컬 디렉터리에 저장
  • 실행 엔진은 Tez
  • 권한/인증은 비활성화되어 테스트나 단일 사용자 환경에 적합

아래는 각 속성(property)의 의미와 용도를 정리한 표이다.

속성 이름용도 설명
hive.server2.enable.doAsfalseHiveServer2가 쿼리를 실행할 때 클라이언트의 사용자 권한으로 실행하지 않도록 설정.
보통 Docker나 테스트 환경에서는 false로 설정해 권한 이슈를 피함.
hive.tez.exec.inplace.progressfalseTez 엔진 실행 중 진행률(progress)을 동일 JVM 내에서 바로 표시할지 여부.
false면 별도 리포팅 스레드에서 진행률 관리. 디버깅/테스트 환경에서 크게 영향 없음.
hive.exec.scratchdir/opt/hive/scratch_dirHive 작업 수행 중 임시 데이터를 저장하는 디렉터리.
쿼리 중간 결과, 임시 파일, stage 파일 등이 저장됨.
hive.user.install.directory/opt/hive/install_dir사용자가 생성한 함수(UDF), JAR 파일 등을 로컬에 배치하는 기본 디렉터리.
보통 UDF 등록 시 ADD JAR 명령으로 여기를 활용.
tez.runtime.optimize.local.fetchtrueTez 태스크가 동일 노드에 데이터가 있을 때 로컬 디스크에서 직접 읽을 수 있도록 최적화.
작은 데이터 처리 시 디스크 I/O 최소화로 성능 향상 가능.
hive.exec.submit.local.task.via.childfalse로컬 모드 실행 시, 각 태스크를 별도 JVM(child process)으로 실행할지 여부.
false면 같은 JVM에서 실행 → 속도는 빠르지만 안정성은 낮음. 테스트 환경에 적합.
mapreduce.framework.namelocalHive가 사용할 MapReduce 프레임워크 모드 지정.
local은 로컬 JVM 안에서 실행됨 (YARN/HDFS 없음). 테스트 환경 기본값.
tez.local.modetrueTez 엔진을 로컬 모드로 실행.
분산 클러스터 없이 단일 노드에서 실행할 때 필요.
hive.execution.enginetezHive의 실행 엔진 지정.
mr(MapReduce), tez, spark 중 선택 가능.
Tez는 Hive의 기본 엔진이며 속도가 빠름.
metastore.metastore.event.db.notification.api.authfalseMetastore 이벤트(notification) 시스템에서 인증 체크를 비활성화.
권한 제어 불필요한 테스트 환경에서 보통 false.
hive.metastore.warehouse.dirfile:/opt/hive/warehouseHive의 기본 데이터 저장 경로(warehouse).
테이블 생성 시 LOCATION이 지정되지 않으면 이 경로에 저장됨.
file:로 시작 → 로컬 파일 시스템 사용.

Hive Metastore 실행

  • hms
docker run -d -p 9083:9083 \
--name hms \
--env SERVICE_NAME=metastore \
-v ./hms/hive-site.xml:/opt/hive/conf/hive-site.xml \
--network mynetwork apache/hive:4.0.1
  • Hiver Server 2
docker run -d -p 10000:10000 -p 10002:10002 --env SERVICE_NAME=hiveserver2 \
--env SERVICE_OPTS="-Dhive.metastore.uris=thrift://hms:9083" \
--env IS_RESUME="true" \
-v ./hms/hive-site.xml:/opt/hive/conf/hive-site.xml \
--network mynetwork \
--name hs2 apache/hive:4.0.1

SERVICE_NAME

컨테이너가 실행할 Hive 서비스의 종류를 지정한다. /opt/hive/bin/startup.sh 또는 /docker-entrypoint.sh (이미지 내부 스크립트)에서 사용하는 값이다.

  • metastore → Hive Metastore 서비스를 실행 (hive --service metastore)
  • hiveserver2 → HiveServer2 (JDBC/Beeline 접속용)
  • cli → Hive CLI

즉, 이 값에 따라 컨테이너가 실행할 서비스 프로세스가 달라진다.

Beeline 실행

docker exec -it hs2 beeline -u "jdbc:hive2://localhost:10000/default" -n hive
- 테이블 생성
``` bash
0: jdbc:hive2://localhost:10000/default> CREATE TABLE hello_hive (id INT, msg STRING);
  • 데이터 입력
0: jdbc:hive2://localhost:10000/default> INSERT INTO hello_hive VALUES (1, 'hello world'), (2, 'from hive');
  • 데이타 조회
0: jdbc:hive2://localhost:10000/default> SELECT * FROM hello_hive;
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+-----------------+
| hello_hive.id  | hello_hive.msg  |
+----------------+-----------------+
| 1              | hello world     |
| 2              | from hive       |
+----------------+-----------------+
2 rows selected (0.18 seconds)
  • 파일 구조 확인

 docker exec -it hms bash

hive@462b27557fd5:/opt/hive/warehouse$ ls -l /opt/hive/warehouse/
total 4
drwxr-xr-x 2 hive hive 4096 Oct 10 04:27 hello_hive

0개의 댓글