Apache Hive는 Hadoop 위에서 SQL 유사 언어(HiveQL)로 대용량 데이터를 처리하는 데이터 웨어하우스 인프라다. 구조화된 데이터를 HDFS에 저장하고 MapReduce/Tez/Spark로 실행한다.
Hive 아키텍처
HiveQL → 파서 → 논리 플랜 → 물리 플랜 → MapReduce/Tez/Spark 실행
↓
Metastore (MySQL/PostgreSQL)
↓
HDFS
Hive vs Spark SQL vs Presto/Trino
| 항목 | Hive | Spark SQL | Trino |
|---|
| 실행 엔진 | MR/Tez/Spark | Spark | 전용 분산 엔진 |
| 지연시간 | 높음 | 중간 | 낮음 |
| 배치 처리 | 최적화 | 좋음 | 제한적 |
| ACID | 지원 (ORC) | 제한적 | 미지원 |
| 메타스토어 | Hive Metastore | 공유 가능 | 외부 연결 |
HiveQL 예시
sql
-- 외부 테이블 생성 (파티션 포함)
CREATE EXTERNAL TABLE events (
event_id STRING,
user_id BIGINT,
event_type STRING,
properties MAP<STRING, STRING>
)
PARTITIONED BY (dt STRING, hour INT)
STORED AS ORC
LOCATION 's3://my-bucket/events/';
-- 파티션 동적 추가
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO events PARTITION(dt, hour)
SELECT event_id, user_id, event_type, properties,
date_format(ts, 'yyyy-MM-dd') as dt,
hour(ts) as hour
FROM raw_events
WHERE dt = '2024-01-01';
-- 집계 쿼리
SELECT event_type,
COUNT(DISTINCT user_id) as unique_users,
COUNT(*) as event_count
FROM events
WHERE dt BETWEEN '2024-01-01' AND '2024-01-07'
GROUP BY event_type
ORDER BY event_count DESC;
최적화 기법
sql
-- 버킷팅으로 조인 최적화
CREATE TABLE orders_bucketed (
order_id BIGINT,
user_id BIGINT
)
CLUSTERED BY (user_id) INTO 32 BUCKETS
STORED AS ORC;
-- Vectorized 실행
SET hive.vectorized.execution.enabled=true;
-- 파티션 pruning 활용
SELECT * FROM events WHERE dt='2024-01-01' AND hour=12;