BUCKET 최적화는 특히 다음과 같은 경우에 효과적:
예시 상황: 사용자(users)와 주문(orders) 데이터를 조인
-- 사용자 테이블 (4개 버킷)
CREATE TABLE users (
user_id INT,
name STRING,
city STRING
)
CLUSTERED BY (user_id) INTO 4 BUCKETS;
-- 주문 테이블 (4개 버킷)
CREATE TABLE orders (
order_id INT,
user_id INT,
amount DECIMAL
)
CLUSTERED BY (user_id) INTO 4 BUCKETS;
데이터 예시:
[users 테이블]
버킷 0: user_id = 4, 8, 12 (hash % 4 = 0)
버킷 1: user_id = 1, 5, 9 (hash % 4 = 1)
버킷 2: user_id = 2, 6, 10 (hash % 4 = 2)
버킷 3: user_id = 3, 7, 11 (hash % 4 = 3)
[orders 테이블]
버킷 0: user_id = 4, 8, 12
버킷 1: user_id = 1, 5, 9
버킷 2: user_id = 2, 6, 10
버킷 3: user_id = 3, 7, 11
최적화 효과:
예시 상황: 특정 지역의 주문 데이터가 매우 많은 경우
CREATE TABLE region_orders (
order_id INT,
region_id INT,
amount DECIMAL
)
CLUSTERED BY (region_id) INTO 8 BUCKETS;
데이터 분포 예시:
[스큐가 있는 경우 - 버킷팅 없을 때]
서울 지역: 1,000,000 건
부산 지역: 100,000 건
대구 지역: 50,000 건
기타 지역: 각 10,000 건
[버킷팅 적용 후]
버킷 0: 서울(125,000), 부산(12,500), 대구(6,250)...
버킷 1: 서울(125,000), 부산(12,500), 대구(6,250)...
...
버킷 7: 서울(125,000), 부산(12,500), 대구(6,250)...
예시 상황: 고객별 총 구매금액 계산
CREATE TABLE customer_transactions (
transaction_id INT,
customer_id INT,
amount DECIMAL,
transaction_date DATE
)
CLUSTERED BY (customer_id) INTO 16 BUCKETS;
맵리듀스 과정 비교:
[버킷팅 없는 경우]
Map 단계:
- 모든 데이터를 customer_id로 그룹화
- 전체 데이터를 셔플링해야 함
Reduce 단계:
- 모든 노드에서 셔플링된 데이터 집계
[버킷팅 있는 경우]
Map 단계:
- 이미 customer_id로 버킷팅되어 있음
- 각 버킷 내에서만 처리
Reduce 단계:
- 버킷별로 독립적으로 집계 가능
- 셔플링 데이터량 대폭 감소
실제 쿼리 예시:
-- 고객별 총 구매금액 계산
SELECT
customer_id,
SUM(amount) as total_amount
FROM customer_transactions
GROUP BY customer_id;
처리 성능 비교:
[버킷팅 없는 경우]
- 데이터 셔플링: 100GB
- 처리 시간: 30분
[버킷팅 있는 경우]
- 데이터 셔플링: 10GB (90% 감소)
- 처리 시간: 5분
버킷팅을 효과적으로 사용하려면 다음 사항을 고려: