슬롯 자동 스케일링
자동 스케일링 설정
BigQuery의 자동 스케일링, 예약 시스템, 그리고 특정 쿼리별 적용 방법에 대한 종합 가이드입니다.
목차
자동 스케일링 방법
1. Flex Slots 사용
Flex Slots는 가장 유연한 자동 스케일링 옵션입니다:
-- 예약 생성 시 자동 스케일링 설정
CREATE RESERVATION my_reservation
OPTIONS(
slot_capacity = 100,
autoscale_max_slots = 500
);
2. Google Cloud Console에서 설정
- BigQuery → 용량 관리 → 예약으로 이동
- “예약 만들기” 클릭
- 자동 스케일링 옵션 활성화:
- 기준 슬롯: 최소 보장 슬롯 수
- 최대 슬롯: 자동 스케일링 최대값
3. gcloud CLI로 설정
# 자동 스케일링이 활성화된 예약 생성
gcloud beta bigquery reservations create \
--location=US \
--reservation=my-reservation \
--slots=100 \
--max-slots=500 \
--autoscale-max-slots=500
4. Terraform으로 구성
resource "google_bigquery_reservation" "reservation" {
name = "my-reservation"
location = "US"
slot_capacity = 100
autoscale {
max_slots = 500
}
}
5. 모니터링 및 최적화
자동 스케일링 효과를 모니터링하려면:
-- 슬롯 사용량 모니터링
SELECT
project_id,
job_id,
total_slot_ms,
creation_time
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
ORDER BY
total_slot_ms DESC;
주요 고려사항
비용 관리
- 최대 슬롯 제한 설정으로 비용 통제
- 사용량 기반 과금 모니터링
성능 최적화
- 피크 시간대 분석
- 적절한 기준/최대 슬롯 비율 설정
워크로드 패턴
- 예측 가능한 패턴: 스케줄 기반 조정
- 예측 불가능한 패턴: 자동 스케일링 활용
BigQuery Editions
BigQuery Editions는 Google이 2023년에 도입한 새로운 가격 책정 및 기능 모델입니다. 기존의 온디맨드/Flat-rate 모델을 대체하는 더 유연한 옵션을 제공합니다.
1. Edition 종류
Standard Edition
- 가장 기본적인 에디션
- 일반적인 분석 워크로드에 적합
- 자동 스케일링 지원
- 비용 효율적
Enterprise Edition
- 고급 기능 포함
- 더 높은 성능과 보안 기능
- 멀티 리전 재해 복구
- 예약된 슬롯 할인 제공
Enterprise Plus Edition
- 최고 수준의 기능과 성능
- 미션 크리티컬 워크로드용
- 최대 가용성 보장
- CMEK, VPC-SC 등 고급 보안
2. 주요 특징
자동 스케일링 (Autoscaling)
-- 자동 스케일링 예약 생성 예시
CREATE RESERVATION my_autoscale_reservation
OPTIONS(
edition = 'ENTERPRISE',
autoscale_max_slots = 1000
);
유연한 슬롯 관리
- 기본 슬롯과 자동 스케일링 슬롯 분리
- 워크로드에 따른 동적 조정
- 비용 예측 가능성 향상
3. Edition별 기능 비교
| 기능 | Standard | Enterprise | Enterprise Plus |
|---|---|---|---|
| 자동 스케일링 | ✓ | ✓ | ✓ |
| 압축 슬롯 | ✗ | ✓ | ✓ |
| 멀티 리전 재해 복구 | ✗ | ✓ | ✓ |
| 3년 약정 할인 | ✗ | ✓ | ✓ |
| CMEK | ✗ | ✗ | ✓ |
| VPC Service Controls | ✗ | ✗ | ✓ |
4. 가격 책정 방식
용량 기반 가격
# 예약 생성 시 edition 지정
gcloud bigquery reservations create \
--project=my-project \
--location=US \
--reservation=my-reservation \
--edition=ENTERPRISE \
--slots=500
약정 할인
- 1년 약정: ~20% 할인
- 3년 약정: ~40% 할인 (Enterprise 이상)
5. 마이그레이션 전략
기존 Flat-rate에서 전환:
-- 기존 슬롯 사용량 분석
SELECT
project_id,
AVG(total_slot_ms) / 1000 as avg_slot_seconds,
MAX(total_slot_ms) / 1000 as max_slot_seconds
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
project_id;
6. Edition 선택 기준
Standard Edition
- 예측 가능한 워크로드
- 비용 최적화가 주요 목표
- 기본 보안 요구사항
Enterprise Edition
- 변동성 있는 워크로드
- 성능 최적화 필요
- 재해 복구 요구사항
Enterprise Plus Edition
- 규제 준수 요구사항
- 최고 수준 보안 필요
- 미션 크리티컬 애플리케이션
7. 모니터링 및 최적화
-- Edition별 슬롯 사용량 모니터링
SELECT
reservation_name,
project_id,
job_id,
total_slot_ms,
total_bytes_billed
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
reservation_name IS NOT NULL
AND creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
total_slot_ms DESC;
Reservation 및 Assignment
중요: CREATE RESERVATION만으로는 모든 쿼리가 자동으로 적용받지 않습니다. 예약을 생성한 후 반드시 Assignment(할당)를 해야 합니다.
1. Reservation 생성 → Assignment 필요
-- 1단계: Reservation 생성
CREATE RESERVATION my_reservation
OPTIONS(
edition = 'ENTERPRISE',
slot_capacity = 500
);
-- 2단계: Assignment 생성 (이 단계가 필수!)
CREATE ASSIGNMENT my_assignment
OPTIONS(
reservation_name = 'my_reservation',
assignee = 'projects/my-project-id' -- 프로젝트 할당
);
2. Assignment 레벨 옵션
프로젝트 레벨 할당
-- 전체 프로젝트에 예약 할당
CREATE ASSIGNMENT project_assignment
OPTIONS(
reservation_name = 'my_reservation',
assignee = 'projects/my-project-id'
);
폴더 레벨 할당
-- 조직 내 폴더 전체에 할당
CREATE ASSIGNMENT folder_assignment
OPTIONS(
reservation_name = 'my_reservation',
assignee = 'folders/123456789'
);
조직 레벨 할당
-- 조직 전체에 할당
CREATE ASSIGNMENT org_assignment
OPTIONS(
reservation_name = 'my_reservation',
assignee = 'organizations/my-org-id'
);
3. Assignment 우선순위
더 구체적인 할당이 우선순위를 가집니다:
프로젝트 할당 > 폴더 할당 > 조직 할당
4. Assignment 없이 실행되는 쿼리
Assignment가 없으면:
- On-demand 과금으로 자동 전환
- Reservation의 슬롯을 사용하지 않음
- 예약의 이점을 받지 못함
5. Assignment 확인 방법
-- 현재 Assignment 확인
SELECT *
FROM `region-us`.INFORMATION_SCHEMA.ASSIGNMENTS
WHERE reservation_name = 'my_reservation';
6. 실시간 적용 확인
-- 쿼리가 어떤 reservation을 사용했는지 확인
SELECT
job_id,
project_id,
reservation_id,
total_slot_ms,
creation_time
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
AND reservation_id IS NOT NULL;
7. gcloud를 사용한 전체 프로세스
# 1. Reservation 생성
gcloud bigquery reservations create \
--location=US \
--reservation=prod-reservation \
--edition=ENTERPRISE \
--slots=1000
# 2. Assignment 생성 (이 단계를 빼먹으면 안됨!)
gcloud bigquery reservations assignments create \
--location=US \
--reservation=prod-reservation \
--assignee_type=PROJECT \
--assignee_id=my-project-id
8. 주의사항
Assignment 누락 시
- Reservation 비용은 발생하지만 사용하지 못함
- 쿼리는 on-demand로 실행되어 추가 비용 발생
Multiple Assignments
- 하나의 예약에 여러 프로젝트 할당 가능
- 슬롯은 할당된 프로젝트들이 공유
즉시 적용
- Assignment 생성 즉시 새로운 쿼리부터 적용
- 실행 중인 쿼리는 영향받지 않음
특정 쿼리에 Assignment 적용
BigQuery에서 특정 쿼리에만 reservation을 적용하는 방법을 소개합니다.
1. Job-level Reservation 지정
가장 직접적인 방법은 쿼리 실행 시 reservation을 명시하는 것입니다:
# Python 클라이언트 예시
from google.cloud import bigquery
client = bigquery.Client()
# Job 설정에서 reservation 지정
job_config = bigquery.QueryJobConfig(
use_legacy_sql=False,
# 특정 reservation 지정
reservation_usage=bigquery.ReservationUsage(
name="projects/my-project/locations/US/reservations/my-reservation"
)
)
query = """
SELECT * FROM `my-dataset.my-table`
WHERE date = CURRENT_DATE()
"""
# 이 쿼리만 지정된 reservation 사용
query_job = client.query(query, job_config=job_config)
2. CLI에서 Reservation 지정
# bq 명령어로 특정 reservation 사용
bq query \
--use_legacy_sql=false \
--reservation_id="projects/my-project/locations/US/reservations/my-reservation" \
"SELECT * FROM my-dataset.my-table"
3. SQL 스크립트에서 SET 문 사용
-- BigQuery 콘솔이나 스크립트에서
SET @@query_reservation = 'projects/my-project/locations/US/reservations/my-reservation';
-- 이후 실행되는 쿼리들이 해당 reservation 사용
SELECT * FROM `my-dataset.my-table`;
SELECT * FROM `my-dataset.another-table`;
-- None으로 설정하면 기본 assignment 사용
SET @@query_reservation = NULL;
4. 별도 프로젝트 전략
-- 특정 워크로드용 프로젝트 생성
-- analytics-project: 일반 쿼리용 (on-demand)
-- etl-project: ETL 작업용 (reservation 할당)
-- ETL 프로젝트에만 reservation assignment
CREATE ASSIGNMENT etl_assignment
OPTIONS(
reservation_name = 'etl_reservation',
assignee = 'projects/etl-project'
);
5. 쿼리 라벨과 모니터링
# 쿼리 라벨로 분류하여 추적
job_config = bigquery.QueryJobConfig(
labels={
"workload_type": "etl",
"priority": "high",
"team": "data-engineering"
},
reservation_usage=bigquery.ReservationUsage(
name="projects/my-project/locations/US/reservations/etl-reservation"
)
)
# 라벨별 슬롯 사용량 모니터링
monitoring_query = """
SELECT
labels.workload_type,
COUNT(*) as query_count,
SUM(total_slot_ms) / 1000 as total_slot_seconds,
reservation_id
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
GROUP BY
labels.workload_type,
reservation_id
"""
6. Workload Management 활용
-- 워크로드별로 다른 reservation 사용
-- 1. 실시간 대시보드용 reservation
CREATE RESERVATION dashboard_reservation
OPTIONS(
edition = 'STANDARD',
slot_capacity = 100
);
-- 2. 배치 처리용 reservation
CREATE RESERVATION batch_reservation
OPTIONS(
edition = 'ENTERPRISE',
slot_capacity = 500,
autoscale_max_slots = 2000
);
-- 3. 애드혹 분석용 (on-demand 사용)
-- Assignment 없이 유지
7. 실용적인 구현 예시
class BigQueryReservationManager:
def __init__(self, project_id):
self.client = bigquery.Client(project=project_id)
self.reservations = {
'etl': 'projects/{}/locations/US/reservations/etl-reservation',
'analytics': 'projects/{}/locations/US/reservations/analytics-reservation',
'ml_training': 'projects/{}/locations/US/reservations/ml-reservation'
}
def run_query_with_reservation(self, query, workload_type='default'):
job_config = bigquery.QueryJobConfig()
# 워크로드 타입에 따라 reservation 선택
if workload_type in self.reservations:
reservation_name = self.reservations[workload_type].format(self.client.project)
job_config.reservation_usage = bigquery.ReservationUsage(
name=reservation_name
)
# 라벨 추가
job_config.labels = {
'workload_type': workload_type,
'timestamp': str(int(time.time()))
}
return self.client.query(query, job_config=job_config)
# 사용 예시
manager = BigQueryReservationManager('my-project')
# ETL 작업은 ETL reservation 사용
etl_job = manager.run_query_with_reservation(
"INSERT INTO cleaned_data SELECT ...",
workload_type='etl'
)
# 분석 쿼리는 analytics reservation 사용
analytics_job = manager.run_query_with_reservation(
"SELECT * FROM analytics_view",
workload_type='analytics'
)
8. Best Practices
워크로드 분류
- ETL vs 애드혹 분석 vs 실시간 대시보드
- 각 워크로드별 적절한 reservation 크기 설정
비용 최적화
- 예측 가능한 워크로드: reservation
- 간헐적 워크로드: on-demand
모니터링
-- Reservation별 사용률 확인
SELECT
reservation_id,
COUNT(*) as job_count,
AVG(total_slot_ms / elapsed_ms) as avg_slots_used
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
GROUP BY
reservation_id;
최종 업데이트: 2025년 1월