Apache Hive는 본래 대용량 데이터를 SQL 형태로 분석할 수 있도록 만들어진 데이터 웨어하우스 솔루션이다.
하지만 오늘날의 데이터 레이크/레이크하우스 환경에서는 “실제 스토리지보다 메타데이터 레이어” 로서의 가치가 더 커졌다.
| 요소 | 역할 | 설명 |
|---|---|---|
| Hive Metastore | 메타데이터 저장소 | 테이블 스키마, 위치, 파티션 정보, 파일 포맷 등을 저장. Spark, Trino, Presto 등 다양한 엔진이 공유 |
| HiveQL | SQL 인터페이스 | 하둡 위에서 SQL로 데이터를 질의할 수 있는 인터페이스 (단, 현재는 다른 쿼리 엔진으로 대체되는 경우 많음) |
| Hive Execution (MapReduce/Tez) | 실행 엔진 | 과거에는 쿼리 실행도 Hive가 담당했으나 현재는 Spark/Trino 등으로 대체되는 추세 |
| HDFS | 기본 스토리지 | 전통적으로 Hive는 HDFS를 기반으로 데이터 레이크를 구성했음 |
레이크하우스 전환 전 단계에서는 Hive가 아래와 같은 전통적인 아키텍처의 중심 허브 역할을 한다.
[Kafka] ─▶ [Spark ETL] ─▶ [HDFS] ─▶ [Hive Metastore] ─▶ [Hive / Presto / Trino Query]
Hive가 없으면 HDFS에 저장된 Parquet/ORC 파일의 위치와 파티션을 개별적으로 관리해야 하므로, 운영 복잡도가 급격히 증가한다. Hive Metastore는 이 복잡성을 추상화하는 핵심 축입니다.
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는 “실행 주체”에서 “카탈로그 제공자”로 역할이 축소·변형되는 형태로 많이 쓰인다.
docker network create mynetwork
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 모드로 실행하기 위한 최소 설정”이다.
아래는 각 속성(property)의 의미와 용도를 정리한 표이다.
| 속성 이름 | 값 | 용도 설명 |
|---|---|---|
hive.server2.enable.doAs | false | HiveServer2가 쿼리를 실행할 때 클라이언트의 사용자 권한으로 실행하지 않도록 설정. 보통 Docker나 테스트 환경에서는 false로 설정해 권한 이슈를 피함. |
hive.tez.exec.inplace.progress | false | Tez 엔진 실행 중 진행률(progress)을 동일 JVM 내에서 바로 표시할지 여부. false면 별도 리포팅 스레드에서 진행률 관리. 디버깅/테스트 환경에서 크게 영향 없음. |
hive.exec.scratchdir | /opt/hive/scratch_dir | Hive 작업 수행 중 임시 데이터를 저장하는 디렉터리. 쿼리 중간 결과, 임시 파일, stage 파일 등이 저장됨. |
hive.user.install.directory | /opt/hive/install_dir | 사용자가 생성한 함수(UDF), JAR 파일 등을 로컬에 배치하는 기본 디렉터리. 보통 UDF 등록 시 ADD JAR 명령으로 여기를 활용. |
tez.runtime.optimize.local.fetch | true | Tez 태스크가 동일 노드에 데이터가 있을 때 로컬 디스크에서 직접 읽을 수 있도록 최적화. 작은 데이터 처리 시 디스크 I/O 최소화로 성능 향상 가능. |
hive.exec.submit.local.task.via.child | false | 로컬 모드 실행 시, 각 태스크를 별도 JVM(child process)으로 실행할지 여부. false면 같은 JVM에서 실행 → 속도는 빠르지만 안정성은 낮음. 테스트 환경에 적합. |
mapreduce.framework.name | local | Hive가 사용할 MapReduce 프레임워크 모드 지정. local은 로컬 JVM 안에서 실행됨 (YARN/HDFS 없음). 테스트 환경 기본값. |
tez.local.mode | true | Tez 엔진을 로컬 모드로 실행. 분산 클러스터 없이 단일 노드에서 실행할 때 필요. |
hive.execution.engine | tez | Hive의 실행 엔진 지정. mr(MapReduce), tez, spark 중 선택 가능. Tez는 Hive의 기본 엔진이며 속도가 빠름. |
metastore.metastore.event.db.notification.api.auth | false | Metastore 이벤트(notification) 시스템에서 인증 체크를 비활성화. 권한 제어 불필요한 테스트 환경에서 보통 false. |
hive.metastore.warehouse.dir | file:/opt/hive/warehouse | Hive의 기본 데이터 저장 경로(warehouse). 테이블 생성 시 LOCATION이 지정되지 않으면 이 경로에 저장됨. file:로 시작 → 로컬 파일 시스템 사용. |
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
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
컨테이너가 실행할 Hive 서비스의 종류를 지정한다. /opt/hive/bin/startup.sh 또는 /docker-entrypoint.sh (이미지 내부 스크립트)에서 사용하는 값이다.
즉, 이 값에 따라 컨테이너가 실행할 서비스 프로세스가 달라진다.
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