빅쿼리 슬롯
슬롯 개념, 관리, 최적화 가이드
BigQuery 슬롯(Slot)에 대한 종합적인 이해와 활용 방법을 다루는 가이드입니다.
목차
1. 슬롯 개념과 정의
1.1 슬롯이란?
BigQuery 슬롯(Slot)은 쿼리를 실행하는 데 필요한 가상 CPU 단위입니다.
- 기본 개념: 쿼리 처리를 위한 연산 리소스의 최소 단위
- 병렬 처리: 복잡한 쿼리는 여러 슬롯을 동시에 사용하여 병렬 처리
- 리소스 격리: 각 슬롯은 독립적인 처리 단위로 작동
1.2 슬롯의 중요성
쿼리 성능 = 할당된 슬롯 수 × 쿼리 복잡도 × 데이터 크기
- 성능 보장: 예약된 슬롯만큼의 처리 능력 보장
- 리소스 예측: 워크로드에 따른 필요 슬롯 수 예측 가능
- 비용 관리: 슬롯 기반 요금제로 비용 예측성 확보
1.3 슬롯 vs 다른 리소스
| 구분 | 슬롯 | 메모리 | 스토리지 |
|---|---|---|---|
| 역할 | 연산 처리 | 임시 데이터 저장 | 영구 데이터 저장 |
| 단위 | 개수 (1 슬롯 = 1 vCPU) | GB | TB |
| 할당 방식 | 동적/예약 | 자동 | 사용량 기반 |
2. 슬롯 작동 원리
2.1 쿼리 실행 과정
graph TD
A[쿼리 제출] --> B[쿼리 계획 수립]
B --> C[슬롯 할당 요청]
C --> D{슬롯 가용성}
D -->|가용| E[슬롯 할당]
D -->|부족| F[대기열]
E --> G[쿼리 실행]
F --> G
G --> H[결과 반환]
H --> I[슬롯 해제]
2.2 슬롯 할당 메커니즘
온디맨드 슬롯
- 공유 풀: Google이 관리하는 공용 슬롯 풀 사용
- 동적 할당: 쿼리 실행 시점에 필요한 만큼 할당
- 최대 한도: 프로젝트당 기본 2,000 슬롯 제한
예약 슬롯
- 전용 할당: 특정 프로젝트/조직에 전용 할당
- 고정 성능: 예약한 슬롯만큼 항상 보장
- 우선 순위: 온디맨드보다 높은 우선순위
2.3 슬롯 스케줄링
-- 쿼리 우선순위 설정 예시
SELECT *
FROM `project.dataset.table`
WHERE condition = true
-- 실행 시 슬롯 우선순위: INTERACTIVE > BATCH
우선순위 레벨
- INTERACTIVE (기본값): 즉시 실행, 높은 우선순위
- BATCH: 지연 실행 허용, 낮은 우선순위
3. 슬롯 종류와 특징
3.1 온디맨드 슬롯
특징
- 즉석 사용: 필요시 즉시 할당
- 공유 리소스: 다른 사용자와 슬롯 풀 공유
- 변동 성능: 가용 슬롯에 따라 성능 변동 가능
적합한 경우
- 불규칙한 워크로드
- 소규모 프로젝트
- 개발/테스트 환경
3.2 예약 슬롯 (Committed Use)
Flex 슬롯
# Flex 슬롯 생성 예시
bq mk --reservation --project_id=PROJECT_ID \
--location=US --slots=100 --ignore_idle_slots=false \
my-flex-reservation
- 최소 약정: 60초
- 유연한 확장: 필요시 즉시 확장/축소
- 시간당 과금: 사용한 시간만큼만 과금
월간/연간 약정 슬롯
# 연간 약정 슬롯 생성
bq mk --reservation --project_id=PROJECT_ID \
--location=US --slots=500 --plan=ANNUAL \
production-reservation
- 장기 약정: 1개월 또는 1년
- 할인 혜택: 장기 약정 시 더 많은 할인
- 안정적 성능: 보장된 슬롯으로 일정한 성능
3.3 에디션별 슬롯 특징
Standard Edition
- 기본 기능: 표준 BigQuery 기능 제공
- 슬롯 성능: 1 슬롯 = 1 vCPU
- 메모리: 슬롯당 기본 메모리 할당
Enterprise Edition
- 고급 기능: 고급 보안, 거버넌스 기능
- 향상된 성능: 더 많은 메모리, 네트워크 대역폭
- 우선 지원: 전담 지원팀 제공
4. 슬롯 관리 및 할당
4.1 슬롯 예약 생성
CLI를 통한 예약 생성
# 기본 예약 생성
bq mk --reservation \
--project_id=my-project \
--location=US \
--slots=1000 \
--plan=FLEX \
my-reservation
# 자동 스케일링 설정
bq mk --reservation \
--project_id=my-project \
--location=US \
--slots=500 \
--max_slots=2000 \
--autoscale_max_slots=2000 \
auto-scaling-reservation
웹 콘솔을 통한 관리
- BigQuery 콘솔 → Reservations
- Create Reservation 클릭
- 필요한 설정값 입력
- Commitment 타입 선택
4.2 할당(Assignment) 관리
프로젝트별 할당
# 특정 프로젝트에 예약 할당
bq mk --assignment \
--reservation_id=projects/my-project/locations/US/reservations/my-reservation \
--job_type=QUERY \
--assignee_id=projects/assigned-project \
--assignee_type=PROJECT
폴더/조직 단위 할당
# 폴더 단위 할당
bq mk --assignment \
--reservation_id=projects/my-project/locations/US/reservations/my-reservation \
--job_type=QUERY \
--assignee_id=folders/123456789 \
--assignee_type=FOLDER
4.3 할당 우선순위
- 프로젝트 할당: 가장 높은 우선순위
- 폴더 할당: 중간 우선순위
- 조직 할당: 가장 낮은 우선순위
- 온디맨드: 할당이 없는 경우
5. 슬롯 모니터링
5.1 슬롯 사용량 모니터링
INFORMATION_SCHEMA를 활용한 모니터링
-- 실시간 슬롯 사용량 조회
SELECT reservation_name
, total_slots
, assigned_slots
, idle_slots
, total_assigned_slots - assigned_slots AS available_slots
FROM `region-US`.INFORMATION_SCHEMA.RESERVATIONS_TIMELINE
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
ORDER BY creation_time DESC;
쿼리별 슬롯 사용량
-- 지난 24시간 동안 쿼리별 슬롯 사용량
SELECT job_id
, user_email
, query
, total_slot_ms
, total_slot_ms / 1000 / 60 AS slot_minutes
, start_time
, end_time
FROM `region-US`.INFORMATION_SCHEMA.JOBS_BY_USER
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND total_slot_ms > 0
ORDER BY total_slot_ms DESC
LIMIT 100;
5.2 Cloud Monitoring 활용
커스텀 대시보드 생성
# monitoring-dashboard.yaml
displayName: "BigQuery 슬롯 모니터링"
mosaicLayout:
tiles:
- width: 6
height: 4
widget:
title: "슬롯 사용률"
xyChart:
dataSets:
- timeSeriesQuery:
timeSeriesFilter:
filter: 'resource.type="bigquery_reservation"'
metricFilter:
metricType: "bigquery.googleapis.com/slots/total_allocated"
알림 설정
# 슬롯 사용률 80% 초과 시 알림
gcloud alpha monitoring policies create \
--notification-channels=NOTIFICATION_CHANNEL_ID \
--display-name="BigQuery 슬롯 사용률 알림" \
--condition-filter='resource.type="bigquery_reservation"' \
--condition-comparison=COMPARISON_GREATER_THAN \
--condition-threshold-value=0.8
5.3 성능 메트릭 분석
핵심 메트릭
- 슬롯 사용률: (사용 중인 슬롯 / 총 할당 슬롯) × 100
- 평균 대기 시간: 쿼리 실행 전 대기 시간
- 처리량: 시간당 완료된 쿼리 수
- 비용 효율성: 슬롯 시간당 처리된 데이터양
6. 슬롯 최적화 전략
6.1 쿼리 최적화
효율적인 쿼리 작성
-- 비효율적인 쿼리 (피해야 할 패턴)
SELECT *
FROM large_table t1
JOIN another_large_table t2 ON t1.id = t2.id
WHERE t1.date_column BETWEEN '2023-01-01' AND '2023-12-31';
-- 최적화된 쿼리
SELECT t1.id
, t1.column1
, t2.column2
FROM large_table t1
JOIN another_large_table t2 ON t1.id = t2.id
WHERE t1.date_column BETWEEN '2023-01-01' AND '2023-12-31'
AND t1._PARTITIONTIME BETWEEN TIMESTAMP('2023-01-01') AND TIMESTAMP('2023-12-31');
파티셔닝 활용
-- 파티션 테이블 생성
CREATE TABLE `project.dataset.partitioned_table`
(
id INT64,
name STRING,
created_date DATE
) PARTITION BY created_date
CLUSTER BY id;
6.2 슬롯 할당 최적화
동적 슬롯 관리
# Python을 활용한 동적 슬롯 관리
from google.cloud import bigquery_reservation_v1
from google.cloud import monitoring_v3
import datetime
def adjust_slots_based_on_usage():
client = bigquery_reservation_v1.ReservationServiceClient()
monitoring_client = monitoring_v3.MetricServiceClient()
# 현재 사용률 조회
current_usage = get_current_slot_usage(monitoring_client)
if current_usage > 0.8: # 80% 초과 시
# 슬롯 증가
increase_slots(client, increase_by=200)
elif current_usage < 0.3: # 30% 미만 시
# 슬롯 감소
decrease_slots(client, decrease_by=100)
def get_current_slot_usage(client):
# 모니터링 API를 통한 사용률 조회 로직
pass
워크로드별 예약 전략
# ETL 워크로드용 예약
bq mk --reservation \
--slots=1000 \
--plan=FLEX \
etl-reservation
# 애드혹 분석용 예약
bq mk --reservation \
--slots=500 \
--plan=FLEX \
analytics-reservation
# 대시보드용 예약
bq mk --reservation \
--slots=200 \
--plan=MONTHLY \
dashboard-reservation
6.3 비용 최적화
슬롯 공유 전략
-- 조직 내 슬롯 사용량 분석
WITH slot_usage AS (SELECT project_id
, reservation_name
, SUM(total_slot_ms) / 1000 / 60 / 60 AS slot_hours
, COUNT(*) AS query_count
FROM `region-US`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND reservation_name IS NOT NULL
GROUP BY project_id, reservation_name)
SELECT project_id
, reservation_name
, slot_hours
, query_count
, slot_hours / query_count AS avg_slot_hours_per_query
FROM slot_usage
ORDER BY slot_hours DESC;
유휴 슬롯 최소화
- 자동 스케일링: 필요에 따라 자동으로 슬롯 조정
- 스케줄 기반 조정: 시간대별 워크로드에 맞춰 슬롯 조정
- 예약 통합: 여러 작은 예약을 큰 예약으로 통합
7. 실제 사용 사례
7.1 대규모 ETL 파이프라인
시나리오
- 데이터량: 일일 100TB 처리
- 처리 시간: 2시간 내 완료 필요
- 워크로드: 매일 새벽 2시~4시 집중
최적 구성
# ETL 전용 대용량 예약
bq mk --reservation \
--project_id=etl-project \
--location=US \
--slots=2000 \
--plan=FLEX \
--ignore_idle_slots=false \
etl-night-batch
# 스케줄 기반 슬롯 조정 (Cloud Scheduler + Cloud Functions)
예상 성능
- 처리 속도: 2000 슬롯으로 약 50TB/시간
- 완료 시간: 2시간 내 100TB 처리 가능
- 비용: Flex 슬롯으로 사용 시간만큼만 과금
7.2 실시간 대시보드
시나리오
- 쿼리 특성: 짧고 빈번한 쿼리
- 응답 시간: 5초 이내 필요
- 사용 패턴: 업무 시간 중 집중 사용
최적 구성
# 실시간 대시보드용 월간 약정
bq mk --reservation \
--project_id=dashboard-project \
--location=US \
--slots=300 \
--plan=MONTHLY \
dashboard-realtime
# 높은 우선순위 설정
bq query --use_legacy_sql=false \
--priority=INTERACTIVE \
--reservation=dashboard-realtime \
"SELECT * FROM dashboard_view LIMIT 1000"
7.3 머신러닝 워크로드
시나리오
- 모델 훈련: 대용량 피처 엔지니어링
- 배치 예측: 일괄 예측 작업
- 실험: 여러 모델 동시 실험
최적 구성
-- ML 훈련용 예약 할당
CREATE OR REPLACE MODEL `ml_project.models.customer_segmentation`
OPTIONS(
model_type='KMEANS',
num_clusters=5,
reservation='ml-training-reservation'
) AS
SELECT customer_id
, feature1
, feature2
, feature3
FROM `ml_project.features.customer_features`;
8. 문제 해결 가이드
8.1 일반적인 문제
슬롯 부족 (Slot Shortage)
증상
- 쿼리 대기 시간 증가
- “Exceeded limit for concurrent queries” 오류
해결 방법
# 1. 현재 슬롯 사용량 확인
bq ls --reservations --location=US
# 2. 슬롯 증가 (Flex 예약인 경우)
bq update --reservation \
--location=US \
--slots=1500 \
my-reservation
# 3. 추가 예약 구매 고려
슬롯 유휴 상태 (Idle Slots)
증상
- 높은 슬롯 비용 대비 낮은 활용률
- 대부분 시간에 슬롯 미사용
해결 방법
# 자동 슬롯 조정 스크립트
def optimize_slot_allocation():
# 지난 7일간 사용 패턴 분석
usage_data = analyze_slot_usage_pattern()
# 사용률이 30% 미만인 시간대 식별
low_usage_periods = identify_low_usage_periods(usage_data)
# 해당 시간대에 슬롯 감소
for period in low_usage_periods:
schedule_slot_reduction(period)
8.2 성능 최적화 문제
쿼리 성능 저하
진단 쿼리
-- 슬롯 사용 효율성 분석
SELECT
job_id,
query,
total_slot_ms,
total_bytes_processed,
(total_slot_ms / 1000) / (total_bytes_processed / POW(2, 30)) AS slot_seconds_per_gb
FROM `region-US`.INFORMATION_SCHEMA.JOBS_BY_USER
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND total_slot_ms > 0
ORDER BY slot_seconds_per_gb DESC
LIMIT 20;
최적화 방법
- 쿼리 재작성: 불필요한 JOIN, 서브쿼리 제거
- 파티션 프루닝: WHERE 절에 파티션 컬럼 포함
- 컬럼 선택: SELECT *보다 필요한 컬럼만 선택
할당 충돌 문제
증상
- 여러 프로젝트가 동일한 예약을 사용할 때 충돌
- 우선순위가 높은 작업이 리소스 독점
해결 방법
# 워크로드별 별도 예약 생성
bq mk --reservation --slots=500 high-priority-reservation
bq mk --reservation --slots=300 medium-priority-reservation
bq mk --reservation --slots=200 low-priority-reservation
# 각각 다른 프로젝트에 할당
bq mk --assignment \
--reservation_id=projects/my-project/locations/US/reservations/high-priority-reservation \
--assignee_id=projects/critical-project \
--assignee_type=PROJECT
8.3 비용 관련 문제
예상보다 높은 비용
원인 분석
-- 일일 슬롯 비용 추이
SELECT DATE(usage_start_time) as usage_date
, reservation_name
, SUM(slot_ms) / 1000 / 60 / 60 AS total_slot_hours
, total_slot_hours * 0.04 AS estimated_cost_usd -- Flex 슬롯 시간당 약 $0.04
FROM `region-US`.INFORMATION_SCHEMA.RESERVATION_USAGE
WHERE usage_start_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY usage_date, reservation_name
ORDER BY usage_date DESC, estimated_cost_usd DESC;
비용 절감 전략
- 약정 전환: Flex → 월간/연간 약정으로 전환 시 할인
- 사용 패턴 분석: 피크 시간대 식별 후 스케줄링 조정
- 리소스 통합: 여러 작은 예약을 하나의 큰 예약으로 통합
마무리
BigQuery 슬롯은 성능과 비용을 함께 관리할 수 있는 핵심 리소스입니다.
핵심 요약
- 개념 이해: 슬롯 = 쿼리 처리를 위한 가상 CPU 단위
- 종류 선택: 워크로드 패턴에 따른 적절한 슬롯 유형 선택
- 모니터링: 지속적인 사용량 및 성능 모니터링 필수
- 최적화: 쿼리 최적화와 슬롯 할당 최적화 병행
베스트 프랙티스
- 점진적 접근: 작은 규모부터 시작하여 점진적 확장
- 지속적 모니터링: 정기적인 사용 패턴 분석 및 조정
- 워크로드 분리: 서로 다른 워크로드는 별도 예약으로 관리
- 비용 최적화: 사용 패턴 기반 약정 타입 선택
최종 업데이트: 2025년 1월