Snowflake
Snowflake
클라우드 네이티브 데이터 웨어하우스. 컴퓨팅/스토리지 분리.
Snowflake
클라우드 네이티브 데이터 웨어하우스. 컴퓨팅/스토리지 분리.
Snowflake는 2012년 설립된 동명의 회사가 개발한 클라우드 네이티브 데이터 웨어하우스입니다. AWS, Azure, GCP에서 동일하게 동작하는 멀티 클라우드 아키텍처로, 컴퓨팅과 스토리지를 완전히 분리해 각각 독립적으로 확장합니다.
아키텍처는 세 레이어로 구성됩니다. Cloud Services(최적화, 보안, 메타데이터), Query Processing(가상 웨어하우스), Database Storage(마이크로 파티션)입니다. 가상 웨어하우스는 T-shirt 사이징(XS~6XL)으로 쿼리 워크로드에 따라 스케일링하고, 사용하지 않을 때 자동 중지해 비용을 절감합니다.
Data Sharing은 Snowflake의 차별화 기능입니다. 데이터 복사 없이 계정 간에 실시간으로 데이터를 공유하고, Snowflake Marketplace에서 서드파티 데이터를 구독합니다. Zero-Copy Cloning으로 테이블, 스키마, 데이터베이스를 순간 복제해 개발/테스트 환경을 빠르게 구성합니다.
Snowpark는 Python, Java, Scala로 Snowflake 내에서 데이터 처리 로직을 실행하는 프레임워크입니다. DataFrame API로 데이터를 변환하고, UDF(User-Defined Function), Stored Procedure를 작성합니다. ML 워크로드도 Snowflake 안에서 처리할 수 있습니다.
-- 데이터베이스 및 스키마 생성
CREATE DATABASE analytics_db;
CREATE SCHEMA analytics_db.raw;
-- 가상 웨어하우스 생성
CREATE WAREHOUSE analytics_wh
WAREHOUSE_SIZE = 'MEDIUM'
AUTO_SUSPEND = 300 -- 5분 후 자동 중지
AUTO_RESUME = TRUE
MIN_CLUSTER_COUNT = 1
MAX_CLUSTER_COUNT = 3; -- 멀티 클러스터 (자동 확장)
-- 테이블 생성
CREATE TABLE raw.sales (
sale_id NUMBER AUTOINCREMENT,
product_id NUMBER,
customer_id NUMBER,
sale_date DATE,
amount DECIMAL(10,2),
region VARCHAR(50)
);
-- S3에서 데이터 로드
COPY INTO raw.sales (product_id, customer_id, sale_date, amount, region)
FROM @my_s3_stage/sales/
FILE_FORMAT = (TYPE = 'PARQUET')
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
-- 분석 쿼리
SELECT
DATE_TRUNC('month', sale_date) AS month,
region,
SUM(amount) AS total_sales,
COUNT(DISTINCT customer_id) AS unique_customers
FROM raw.sales
WHERE sale_date >= '2024-01-01'
GROUP BY 1, 2
ORDER BY 1, total_sales DESC;
-- Zero-Copy Cloning (즉시 복제)
CREATE TABLE raw.sales_backup CLONE raw.sales;
CREATE DATABASE analytics_dev CLONE analytics_db;
-- Time Travel (과거 데이터 조회, 기본 1일)
SELECT * FROM raw.sales AT (OFFSET => -60*60); -- 1시간 전
SELECT * FROM raw.sales BEFORE (TIMESTAMP => '2024-01-15 10:00:00');
-- Data Sharing (읽기 전용 공유)
CREATE SHARE sales_share;
GRANT USAGE ON DATABASE analytics_db TO SHARE sales_share;
GRANT SELECT ON TABLE raw.sales TO SHARE sales_share;
ALTER SHARE sales_share ADD ACCOUNTS = partner_account;
-- Snowpark (Python)
-- from snowflake.snowpark import Session
-- from snowflake.snowpark.functions import col, sum as sum_
--
-- session = Session.builder.configs(connection_params).create()
--
-- df = session.table("raw.sales")
-- result = (df
-- .filter(col("sale_date") >= "2024-01-01")
-- .group_by("region")
-- .agg(sum_("amount").alias("total_sales"))
-- .sort(col("total_sales").desc())
-- )
-- result.show()
-- Python UDF 생성
CREATE OR REPLACE FUNCTION calculate_tax(amount FLOAT)
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'compute_tax'
AS $$
def compute_tax(amount):
return amount * 0.1
$$;
SELECT sale_id, amount, calculate_tax(amount) AS tax FROM raw.sales;
-- Stream (CDC)
CREATE STREAM sales_changes ON TABLE raw.sales;
-- 변경 사항 조회
SELECT * FROM sales_changes;
시니어: "테스트 환경에 프로덕션 데이터 필요하면 Zero-Copy Cloning 쓰세요. 몇 초 만에 복제되고 스토리지 비용도 안 들어요."
주니어: "웨어하우스 사이즈는 어떻게 정해요?"
시니어: "쿼리 복잡도에 따라 달라요. 간단한 조회는 XS, 대량 ETL은 L 이상 쓰고, AUTO_SUSPEND로 비용 관리하세요."
면접관: "Snowflake 경험을 말씀해주세요."
지원자: "Redshift에서 Snowflake로 마이그레이션했습니다. 컴퓨팅/스토리지 분리로 비용이 40% 절감되었고, Zero-Copy Cloning으로 개발 환경 구축 시간이 하루에서 분 단위로 단축되었습니다. Snowpark로 Python ML 모델을 Snowflake 내에서 실행해 데이터 이동 없이 배치 추론을 수행했습니다."
리뷰어: "대량 쿼리 실행 전에 웨어하우스 사이즈 확인하세요. XS로 돌리면 몇 시간 걸려요."
개발자: "L로 바꾸고 AUTO_SUSPEND 설정해서 완료 후 바로 끄게 하겠습니다."