Computer Engineering/DataPlatform

Snowflake 소개 및 사용법

jordan.bae 2020. 9. 6. 16:21

Introduction

Snowflake logo

Snowflake는 Datawarehouse solution의 이름이자 회사의 이름입니다.

아직은 한국에서는 사용하는 회사를 본 적이 없지만, 미국에서는 굉장히 많은 회사에서 이용 중인 솔루션입니다.

최근에 IPO 신청하면서 미국 주식에 투자하는 국내 투자자들과 엔지니어들도 관심을 가지고 있지 않을까 하는 생각이 듭니다. 그래서 이번에 회사에서 Datawarehouse solution을 선정하기 위해서 Snowflake를 Research 및 Test한 내용과 개인적으로 Udemy에서 강의를 들으면서 공부한 내용을 이 글에서 소개하려고 합니다.

 

Snowflake main page

 먼저 간단하게 Snowflake의 핵심 내용 및 Key Summary를 요약해보면, Snowflake의 가장 큰 특징은 위에서 보는 것과 같이 SIngle Platform으로 데이터 저장소와 관련된 모든 필요한 workload를 쉽고 빠르게 제공한다는 점입니다. 즉, 이 말은 사이즈가 큰(수십 GB ~ PB) 데이터를 위한 분석(기존 Datawarehouse, Data Lake의 역할) 뿐만 아니라 Data Mart같은 Data application의 Source로도 사용이 가능하고, Data engineering과 관련된 기능들도 제공하는데 이 모든 작업을 동시에 수행이 가능하다는 점입니다. (개인적으로는 ML과 관련된 기능이 없다는 점은 조금 아쉽습니다. 하지만 곧, 추가가 되지 않을까 라는 생각이 듭니다.) 다양한 workload들을 동시에 수행할 수 있다는 점이 정말 powerful하고 이를 flexible하게 관리 할 수 있다는 점은 정말 사용하면서 너무 편리하다라는 생각을 들게 합니다.

 

 제가 짧지만 사용하면서 가장 큰 장점으로 다가왔던 부분은 Serverless와 Non-Serverless서비스의 단점들을 잘 해결해 놓아서 serverless가 아닌데 serverless같은 느낌을 준다는 점입니다. 즉, 내가 마음대로 리소스들을 control하는데 관리할 것이 별로 없습니다. Serverless를 사용하면 내가 컴퓨팅 자원을 마음대로 늘리거나 하는 부분이 어려운데 Snowflake에서는 Scale up/out을 아주 쉽게(auto scaling out 지원, scale up도 굉장히 쉬움(원클릭).)할 수 있게 만들어 놓았고, 또 자원을 사용하지 않으면 자동으로(auto suspend) 중지해주고, workload가 들어오면 자동으로 시작(auto resume)합니다. 그리고 한 번에 여러 개의 workload를 처리할 수 있도록, Storage와 Computing을 분리하는 구조로 만들어져서 여러개의 전용 Computing 리소스를 만들어서 각 workload에 독립적으로 할당하여 서로 영향을 받지 않고 작업을 수행 할 수 있습니다. 

 

 

Key Concept & Architecture

Snowflake는 data warehouse SaaS로 haradware, software와 관련된 설정이나 설치등 manage가 필요없는 클라우드 서비스입니다.

또한, Snowflake는 기존 data warehouse들보다 더 빠르고, 쉽게 사용할 수 있다고 소개하면서 기존 데이터베이스나 hadoop과 같은 소프트웨어에 구축한 것이 아니라 Cloud를 위해 설계된 고유한 아키텍쳐를 갖춘 새로운 SQL 데이터베이스 엔진을 사용한다고 말하고 있습니다.

또, Cloud로 제공되기 때문에 AWS, GCP, Azure중에 선택해서 서비스를 사용할 수 있습니다.

Snowflake Document사이트의 Architecture 소개 사진

Snowflake는 architecture에 대해서 shared-disk database의 방식과 shared-nothing database의 hybrid된 구조라고 소개하고 있습니다. shared-disk database처럼 모든 computing node들이 하나의 중앙 데이터 저장소를 이용하면서, shared-noting architecture와 비슷하게 클러스터 내의 각 node가 전체 데이터 세트의 일부를 local에 저장하는 MPP방식을 사용하여 쿼리를 처리합니다. 이러한 구조로 데이터 관리에 대한 단순함을 제공하지만 Query 성능과 Scale out에 대한 이점을 동시에 제공합니다.

 

Udemy강의 내용 중 일부

이러한 구조로 하나의 Storage와 여러 개의 Computing node로 구성하여 각 node에게 각각의 필요한 Job들을 나눠서 수행할 수 있습니다.

위에 그림을 보면 여러 개의 VIrtual warehouse를 만들고 각각의 workload에 맞게 할당 한 것을 볼 수 있습니다.

X-SMALL: ETL/ELT Job

SMALL: Marketing Analytics

Medium: Reporting and BI tool 등...

 

+ Ressource 관리가 얼마나 쉬운지 잠깐 보여드리면 아래와 같습니다.

snowflake admin page

또한, Auto Scaling out을 지원하기 때문에 관리 요소 또한 적습니다. cluster수의 min, max를 설정해서 갑자기 요청이 만들어는 경우에는 auto scaling을 할 수 있고 Scale up또한 downtime없이 원클릭으로 바로 할 수 있습니다.

 

 

ETL & ELT

데이터를 가져오는 작업과 관련해서 Snowflake에서는 Batch, Streaming 두 가지 방식을 지원합니다.

Batch

Stage와 Copy command를 통해서 AWS S3, Azure Storage, GCP Storage에서 데이터를 가져올 수 있습니다.

간단하게 sample코드를 보여드리면 아래와 같습니다.

CREATE DATABASE ingest_data;

CREATE TABLE customer(
	Customer_ID string,
	Customer_Name string,
	Customer_Email string,
	Customer_City string,
	Customer_State string,
	Customer_DOB DATE
)

# create an external stage using the S3 bucket
create or replace stage bulk_copy_example_stage url='s3://snowflake-essentials/ingesting_data/new_customer';

# list the files in the bucket
    
copy into customer
 from @bulk_copy_example_stage
 pattern='.*.csv'
 file_format = ( type = csv field_delimiter = '|' skip_header = 1);

Snowflake에서는 파일 사이즈를 10MB~100MB를 권장하고 있습니다. 이를 지키지 않으면 performance가 많이 떨어질 수 있습니다.

Snowflake에서는 Large warehouse 한대로 300GB를 1시간 안에 옮길 수 있다고 합니다. 이는 최고 시나리오에서 진행한 것일 것이기 때문에 참고사항으로만 생각하시면 좋을 것 같습니다.

 

당연히 파일 format은 csv, parquet등 다양한 포맷을 지원하고 data type도 json 타입도 지원합니다.

- file format관련 문서

docs.snowflake.com/en/user-guide/data-load-prepare.html#:~:text=Currently%20supported%20semi%2Dstructured%20data,as%20the%20object%20is%20valid.

- data type 관련 문서:

docs.snowflake.com/en/sql-reference/data-types.html

 

Streaming 

Snowflake에서는 snowpipe라는 feature를 통해서 streaming data를 저장하는 것 또한 지원합니다.

연속적으로 들어오는 transaction이나 event를 저장할 때 사용하게 됩니다. 이 기능은 virtual warehouse의 리소스를 따로 사용하지 않습니다.(virtual warehouse는 매우 비싸서 streaming data를 처리하기에는 부적합 합니다.)

Udemy 강의 슬라이드 첨부

위 그림과 같이 각 provider의 storage에서 trigger를 만들고 이를 snowpipe를 통해서 데이터를 가져 올 수 있습니다.

 

Sample code

아래와 같이 snowpipe를 생성하면 notification channel로 sqs가 생성되는데 S3에 가서 register notification channel에 해당 sqs를 등록하면 됩니다.

USE DATABASE ingest_data;


-- create an external stage using S3
CREATE OR REPLACE STAGE snowpipe_copy_example_stage url='s3://snowflake-essentials-streaming/transactions';

-- list the files in the bucket
LIST @snowpipe_copy_example_stage;

CREATE TABLE transactions
(
  Transaction_Date DATE,
  Customer_ID NUMBER,
  Transaction_ID NUMBER,
  Amount NUMBER
)

COPY INTO transactions FROM @snowpipe_copy_example_stage
file_format = (type = csv field_delimiter = '|' skip_header = 1);


CREATE pipe transaction_pipe
auto_ingest = true
AS COPY INTO transactions FROM @snowpipe_copy_example_stage
file_format = (type = csv field_delimiter = '|' skip_header = 1);

SHOW PIPES;

snowpipe또한 권장하는 파일사이즈는 10MB~100MB 라고 합니다.

이 글은 전체적인 소개글이기 때문에 자세한 내용이 궁금하신 점은 댓글로 남겨주시거나 공식 문서를 참고 하시면 도움이 될 것 같습니다.

 

 

Performance Tunning

Snowflake에서는 Performance tunning할 point가 많지 않습니다. 장점 이기는 하지만 DBA 입장에서는 음...내가 뭘 해야하지 할 수 있습니다. Performance tunning할 시간에 데이터 모델링에 집중하고, 데이터 분석에 집중할 수 있는 시간을 확보할 수 있다고 생각하면 될 것 같습니다.

 

Partitioning using cluster key

Snowflake는 자체적으로 micron partitioning을 하기는 하지만 시계열 데이터나 partition으로 사용할 좋은 key가 있으면 manual로 cluster key를 설정할 수 있습니다.

create or replace table t1 (c1 date, c2 string, c3 number) cluster by (c1, c2);

Cluster key로는 single column, multiple columns, expression(ex)to_date(), substring)을 지원합니다.expression까지 지원한다는 점이 장점일 수 있을 것 같습니다.

당연히 scan하는 양이 줄어들기 때문에 성능상의 이점이 있고, 이를 profile페이지를 통해서 profiling하기도 좋습니다.

clustering에 대한 자세한 사항은 공식 문서를 조금 더 살펴보시면 좋을 것 같습니다.

docs.snowflake.com/en/user-guide/tables-clustering-keys.html

 

Scale-up/out, 

 

당연하지만 Scaling을 조정해서 performance를 올릴 수 있습니다.(돈을 그냥 더 쓰는거라서...)

하지만, 위에서 소개드린 것 처럼 아주 쉽게 할 수 있고 cluster의 수를 auto-scaling out하고, auto supsend 그리고 auto-resume을 지원하기 때문에 필요할 때만 리소스를 사용할 수 있습니다.

 

Cache

자동으로 cache를 지원하고 동일한 쿼리에 대해서는 cache를 이용합니다. cache는 24시간 동안 지속됩니다.

 

 

Pricing

Snowflake Pricing page

Snowflake의 단점 중 하나입니다. Snowflake는 가격이 조금 비싼 편입니다.

일단 가격은 크게 Storage비용 그리고 Virtual warehouse 비용 그리고 만약 snowpipe를 사용한다면 snowpipe비용이 있습니다.

여기서는 Storage와 Virtual warehouse 비용 위주로 이야기를 하겠습니다.

 

Storage

 

먼저 Storage는 그림과 같습니다.

대략적인 비용으로 회사마다 다를 수 있습니다. 사실 Storage비용은 크지 않아서 Computing비용만 집중해서 보면 됩니다.

Udemy 강의 캡쳐

 

+ 참고로 Snowflake의 data compression 능력은 비슷한 솔루션에서 가장 뛰어난 편입니다. 저 같은 경우에 Parquet데이터를 넣었는데도 30%정도 데이터 사이즈가 줄어들었습니다. 

 

Virtual Warehouse

Snowflake는 credit이란 단위를 사용합니다. 맨 위의 그림을 보시면 알겠지만 credit은 어떤 plan을 쓰느냐에 따라서 가격이 달라집니다.

Udemy강의에서는 enterprise를 $4.05 달러라고 소개하고 있습니다.

만약에 x-Large를 사용한다고 하면 16 x 4.05 = 약 $65 정도입니다. X-large만해도 시간당 8만원 정도이기 때문에 가격대가 상당합니다. 예를 들어 30일 동안 full로 사용한다고 하면 $46,656 입니다. 물론 datawarehouse를 하루 종일 사용할 필요도 없지만, 가격이 상당하기 때문에 resource관리가 엄청 중요합니다. 또한 snowflake를 사용한다면 snowflake의 workload에 맞게 최적화하는 작업이 꼭 필요합니다.

 

그 밖의 Features

Time travel & Clone

Snowflake는 time travel 및 cloning을 지원합니다. 

Udemy 강의 내용 캡쳐

Sample code입니다.

SELECT CURRENT_TIMESTAMP;

update CUSTOMER set Job = 'Snowflake Architect';

-- time travel to a time just before the update was run
select * from CUSTOMER before(timestamp => '2020-05-26 03:20:15.855'::timestamp);

-- time travel to 10 minutes ago
select * from CUSTOMER AT(offset => -60*10);

-- time travel to before update query was run
select * from CUSTOMER before(statement => 'query_id');

DROP TABLE CUSTOMER;

// RESTORE TABLE
UNDROP TABLE CUSTOMER;

DROP SCHEMA <schema_name>;
UNDROP SCHEMA <schema_name>;

DROP DATABASE <database_name>;
UNDROP DATABASE <database_name>;

 

Clone같은 경우는 AWS RDS와 같이 실제 data는 copy하지 않고 metadata만 copy합니다.

+Clone과 time travel을 같이 사용할 수도 있습니다.

 

Data sharing

데이터를 table, schema, database단위로 다른 snowflake account 또는 snowflake없더라도 reader account를 만들어줘서 공유할 수 있습니다. 자세한 내용은 문서를 참고하시면 됩니다.

 

이 밖에도 access management를 위한 기능들 그리고 다양한 기능들이 많이 있습니다.

 

 

Final Summary

Snowflake는 정말 훌륭한 기술력을 바탕으로 서비스를 제공하고 있습니다. AWS, Google, Azure의 datawarehouse solution들과 비교해도 밀리지 않는 performace와 서비스를 제공하고 있는 것만 봐도 이 회사가 얼마나 기술력이 좋은지 알 수 있습니다. 장점은 말 그대로 사용하기 쉽고, 강력(computing power)하고, 기능이 많습니다. 단점으로는 비싼 가격과 위의 경쟁 업체들과 대비하여 생태계(다른 data service들)가 조금 약한 점이 있을 것 같습니다. 하지만, snowflake는 여러 DTS, ML 서비스들과 Partnership을 통해서 이를 극복해 나가고 있습니다. Snowflake가 앞으로 어떻게 제품을 만들어 나갈지 다른 경쟁사들과 어떻게 경쟁해 나갈지 그리고 상장하면 주가가 어떻게 될지 너무 궁금합니다. 우리나라에도 이런 기술력 바탕으로 소프트웨어를 만드는 회사가 많이 나왔으면 좋겠습니다. (나부터 잘하자...)

 

참고링크

 

Snowflake 30-Day Free Trial ($400) : trial.snowflake.com/

Udemy 강의: www.udemy.com/course/snowflake-essentials/

G2 BigQuery vs Snowflake: www.g2.com/compare/google-bigquery-vs-snowflake

 

혹시, 잘못된 정보가 있다면 댓글로 알려주시면 감사하겠습니다. 

긴 글 읽어주셔서 감사합니다. 도움이 되셨다면 좋겠습니다.

 

반응형