Azure Synapse-Snowflake 마이그레이션 가이드¶
Snowflake 마이그레이션 프레임워크¶
일반적인Azure Synapse-Snowflake 마이그레이션은 9가지 주요 단계로 구성됩니다. 이 가이드는 관련된 기술적 과제 및 전략적 과제 탐색을 통해 Azure의 분석 플랫폼에서 Snowflake의 클라우드 데이터 플랫폼으로 원활하게 전환할 수 있도록 포괄적인 프레임워크를 제공합니다.
마이그레이션 단계¶
1단계: 계획 및 설계¶
이 초기 단계는 성공적인 마이그레이션의 기반을 마련하는 데 매우 중요합니다. Azure Synapse에서 마이그레이션하려면 통합 구성 요소에 대한 명확한 이해와 이해관계자를 정렬시키고 범위를 정의하며 예산 초과를 방지하기 위한 철저한 계획이 필요합니다.
실행 가능한 단계:
Synapse 환경에 대한 철저한 평가 수행:
인벤토리 및 분석: 전용 SQL 풀 테이블, 서버리스 SQL 풀 뷰, 스키마, T-SQL 저장 프로시저, 함수, 뷰를 포함하여 Synapse 작업 공간 내의 모든 오브젝트를 카탈로그화합니다. Synapse의 시스템 뷰(예: sys.tables, sys.procedures)를 사용하여 메타데이터를 수집합니다.
워크로드 분석: Azure Monitor 및 Synapse의 동적 관리 뷰(DMVs)를 사용하여 쿼리 패턴, 사용자 동시성, 리소스 사용률(DWUs), 성능 병목 상태를 식별합니다. 이 데이터는 Snowflake 가상 웨어하우스 전략을 설계하는 데 매우 중요합니다.
종속성 식별: 모든 업스트림 데이터 소스, 특히 ADF(Azure Data Factory) 파이프라인과 Power BI 보고서, Azure Machine Learning 모델 및 기타 애플리케이션과 같은 다운스트림 컨슈머를 매핑합니다.
마이그레이션 범위 및 전략 정의:
워크로드 우선 순위 지정: 비즈니스 영향과 기술적 복잡성을 기준으로 워크로드를 분류합니다. 가치를 입증하고 추진력을 확보하기 위해 영향력은 높고 복잡성은 낮은 워크로드(예: 특정 데이터 마트)부터 시작합니다.
마이그레이션 접근 방식 선택: 더 빠른 마이그레이션을 위한 “리프트 앤 시프트” 접근 방식이나 데이터 모델과 파이프라인을 현대화하기 위한 아키텍처 재구성 접근 방식 중에서 결정합니다.
프로젝트 계획 개발:
팀 구성: 명확한 역할(프로젝트 관리자, 데이터 엔지니어, Synapse 및 SQL DBA, Snowflake 설계자, 보안 관리자, 비즈니스 분석가)을 갖춘 마이그레이션 팀을 구성합니다.
타임라인 만들기: 9단계 각각에 대해 현실적인 타임라인과 마일스톤을 정의합니다.
성공 메트릭 정의: 명확한 KPIs를 설정하여 비용 절감, 쿼리 성능 개선, 사용자 만족도와 같은 성공을 측정합니다.
2단계: 환경 및 보안¶
탄탄한 계획을 바탕을 수립했다면, 다음 단계는 Snowflake 환경을 준비하고 Azure의 보안 모델을 변환하는 것입니다. 데이터 전송 및 네트워크 통합을 간소화하려면 Azure에서 Snowflake를 호스팅하는 것이 매우 좋습니다.
실행 가능한 단계:
Snowflake 계정 설정:
에디션 및 클라우드 공급자 선택: 요구 사항을 충족하는 Snowflake 에디션(예: Standard, Enterprise, Business Critical)을 선택합니다. 클라우드 공급자로 Azure를 선택하고 Azure Data Lake Storage(ADLS Gen2)를 사용하여 데이터 전송 비용과 대기 시간을 최소화합니다.
웨어하우스 전략 설계: 1단계의 워크로드 분석을 기반으로 초기 가상 웨어하우스를 만듭니다. 다양한 워크로드(예: WH_LOADING, WH_TRANSFORM, WH_BI_ANALYTICS)를 분리하여 리소스 경합을 방지합니다. 티셔츠 사이즈(예: X-Small, Small)로 시작하여 성능 테스트를 기반으로 크기를 조정합니다.
보안 모델 구현:
Azure AD 주체를 Snowflake 역할로 매핑: AAD(Azure Active Directory) 사용자 및 그룹을 Snowflake의 계층적 역할 기반 액세스 제어(RBAC) 모델로 변환합니다. 기능 역할(SYSADMIN, SECURITYADMIN) 및 액세스 역할(BI_READ_ONLY, ETL_READ_WRITE)의 계층 구조를 생성합니다.
네트워크 정책 및 인증 구성: 보안 연결을 위해 Azure Private Link를 사용하여 신뢰할 수 있는 IP주소로 액세스를 제한하는 네트워크 정책을 설정합니다. Azure AD에서 Snowflake를 엔터프라이즈 애플리케이션으로 설정하여 SSO를 구성합니다.
3단계: 데이터베이스 코드 변환¶
이 단계에는 Synapse의 T-SQL 기반 DDL, DML 및 프로시저 코드를 Snowflake와 호환되도록 변환합니다. 자동화 도구를 사용하면 이 프로세스를 가속화할 수 있지만, 수동 검토가 필수적입니다.
실행 가능한 단계:
DDL(데이터 정의 언어) 변환:
테이블 및 뷰: Synapse에서 CREATE TABLE 및 CREATE VIEW 문을 추출합니다. Synapse 관련 데이터 타입을 상응하는 Snowflake 데이터 타입으로 변환합니다(부록 2 참조).
Synapse 관련 절 제거: DISTRIBUTION(예: ROUND_ROBIN, HASH)과 같은 Synapse 관련 물리적 배포 절 및 CLUSTERED COLUMNSTORE INDEX와 같은 인덱싱 전략을 제거합니다. Snowflake는 데이터 배포 및 저장을 자동으로 관리합니다.
제약 조건 재구현: Snowflake는 NOT NULL 제약 조건만 적용합니다. PRIMARY KEY 및 UNIQUE 제약 조건은 정보 제공용입니다. 다른 모든 데이터 무결성 논리는 ETL 및 ELT 프로세스로 이동해야 합니다.
DML(데이터 조작 언어) 및 프로시저 코드 변환:
T-SQL 저장 프로시저 재작성: Synapse의 T-SQL 저장 프로시저는 Snowflake Scripting(SQL), JavaScript 또는 Python과 같이 Snowflake에서 지원하는 언어로 다시 작성해야 합니다.
SQL 함수 변환: Synapse 및 T-SQL 관련 함수를 Snowflake 함수로 매핑합니다(예: GETDATE()는 CURRENT_TIMESTAMP()가, ISNULL()은 IFNULL()이 됨). 일반적인 매핑은 부록 3을 참조하세요.
4단계: 데이터 마이그레이션¶
이 단계에서는 Synapse SQL 풀에서 Snowflake 테이블로 과거 데이터를 물리적으로 이동하는 데 중점을 둡니다. 가장 효율적인 방법은 ADLS Gen2(Azure Data Lake Storage)를 중간 스테이징 영역으로 활용하는 것입니다.
실행 가능한 단계:
Synapse에서 ADLS Gen2로 데이터 언로드:
Synapse에서 CREATE EXTERNAL TABLE AS SELECT(CETAS) 명령을 사용하여 테이블의 데이터를 ADLS Gen2 계정의 지정된 컨테이너로 내보냅니다.
Snowflake에 최적의 로딩 성능을 제공하기 위해 데이터를 Parquet 또는 압축 CSV 형식으로 저장합니다.
ADLS Gen2에서 Snowflake로 데이터 로드:
외부 스테이지 만들기: Snowflake에서 ADLS Gen2에 안전하게 연결하기 위한 저장소 통합 오브젝트를 만든 후 언로드된 데이터가 있는 컨테이너를 가치키는 외부 스테이지를 만듭니다.
COPY INTO 명령 사용: Snowflake의 COPY INTO<table> 명령을 사용하여 ADLS 스테이지의 데이터를 대상 Snowflake 테이블로 로드합니다.
확장된 웨어하우스 활용: 초기 데이터 로드 시 더 큰 전용 가상 웨어하우스를 사용하여 프로세스 속도를 높인 후, 이후에 규모를 축소하거나 일시 중단합니다.
**5단계: 데이터 수집¶
과거 데이터가 마이그레이션되었으면, 진행 중인 데이터 수집 파이프라인을 재설계하여 일반적으로 Azure Data Factory에서 데이터를 Snowflake에 직접 공급해야 합니다.
실행 가능한 단계:
ADF(Azure Data Factory) 파이프라인 마이그레이션:
ADF 파이프라인에서 Synapse 데이터 세트 및 활동을 상응하는 Snowflake 항목으로 바꿉니다. 소스 및 싱크 활동 모두에 대해 ADF에서 Snowflake의 네이티브 커넥터를 사용합니다.
Snowflake의 SQL 언어를 사용하도록 조회 또는 스크립트 활동을 업데이트합니다.
Snowpipe로 지속적인 수집 구현:
ADLS Gen2에 도달하는 연속 데이터 스트림을 위해 Snowpipe를 구성합니다. Snowpipe는 Snowflake 테이블로 새 데이터 파일이 도착하는 즉시 효율적으로 자동 로드하여 거의 실시간 수집 솔루션을 제공합니다. 이는 Azure Event Grid 알림에 의해 트리거될 수 있습니다.
Snowflake 에코시스템 활용:
Kafka 및 Spark와 같은 플랫폼용 Snowflake 네이티브 커넥터를 탐색하여 직접 데이터 스트리밍을 간소화합니다.
6단계: 보고 및 분석¶
이 단계에서는 Snowflake에서 데이터를 쿼리하도록 모든 다운스트림 애플리케이션, 특히 BI를 리디렉션합니다.
실행 가능한 단계:
연결 드라이버 업데이트: Power BI 데스크톱 및 온프레미스 데이터 게이트웨이에 최신 Snowflake 드라이버가 있는지 확인합니다.
** Power BI 보고서 리디렉션:**
Power BI에서 각 보고서의 데이터 소스를 편집하여 Azure Synapse에서 Snowflake로 연결을 전환합니다. Snowflake의 네이티브 Power BI 커넥터는 인증을 받았으며 적극 권장됩니다.
모든 중요한 보고서와 대시보드를 테스트합니다. 성능 특성이 변경되므로 DirectQuery를 사용한 보고서에 주의를 기울입니다.
쿼리 검토 및 최적화:
일부 보고서에는 네이티브 T-SQL 쿼리가 포함될 수 있습니다. Snowflake의 SQL 언어를 사용하려면 이를 리팩터링해야 합니다. Snowflake의 쿼리 프로필 도구 및 Power BI의 성능 분석기를 사용하여 느리게 실행되는 보고서를 최적화합니다.
7단계: 데이터 유효성 검사 및 테스트¶
새 플랫폼에 대한 비즈니스 신뢰를 구축하고 데이터 무결성과 성능이 기대치를 충족하는지 확인하기 위해서는 엄격한 테스트가 필수입니다.
실행 가능한 단계:
데이터 유효성 검사 수행:
행 수: Synapse의 소스 테이블과 Snowflake의 대상 테이블 간의 행 수를 비교합니다.
셀 수준 유효성 검사: 중요한 테이블의 경우 주요 열의 집계된 값(SUM, AVG, MIN, MAX)을 비교하여 심층적인 유효성 검사를 수행합니다.
쿼리 및 성능 테스트 수행:
벤치마크 쿼리: Synapse 및 Snowflake 모두에 대해 대표적인 쿼리 세트를 실행하고 결과와 성능을 비교합니다.
BI 도구 성능: Snowflake에 연결된 주요 Power BI 대시보드의 로딩 시간과 상호 작용을 테스트합니다.
사용자 수용 테스트(UAT):
새로운 Snowflake 환경에서 비즈니스 사용자를 참여시켜 보고서의 유효성을 검사하고 일상적인 작업을 수행합니다.
8단계: 배포¶
배포는 Azure Synapse에서 Snowflake로 전환하는 최종 단계입니다. 이 프로세스는 비즈니스 운영 중단을 최소화하기 위해 신중하게 관리해야 합니다.
실행 가능한 단계:
전환 계획 개발:
전환에 대한 이벤트 시퀀스를 정의합니다. 여기에는 Synapse를 가리키는 ADF 파이프라인 중지, 최종 데이터 동기화 수행, 모든 연결 리디렉션, 시스템 상태 유효성 검사 작업이 포함됩니다.
최종 데이터 동기화 실행:
마지막 증분 데이터 로드를 한 번 수행하여 테스트 단계 중에 발생한 모든 데이터 변경 사항을 캡처합니다.
시작:
모든 프로덕션 데이터 파이프라인과 사용자 연결을 Synapse에서 Snowflake로 전환합니다.
해제하기 전에 대체 수단으로 짧은 기간 동안 Synapse 환경을 사용할 수 있도록 유지(가능한 경우 일시 중지)합니다.
** Synapse 해제:**
Snowflake 환경이 프로덕션에서 안정화되고 검증되면 비용이 발생하지 않도록 Synapse SQL 풀을 해제할 수 있습니다.
9단계: 최적화 및 실행¶
이 마지막 단계는 새로운 Snowflake 환경에서 성능, 비용 및 거버넌스를 관리하는 지속적인 프로세스입니다.
실행 가능한 단계:
성능 및 비용 최적화 구현:
웨어하우스를 적절한 크기로 조정: 워크로드 성능을 지속적으로 모니터링하고 가상 웨어하우스 크기를 조정합니다. 이는 Synapse DWUs의 확장 개념을 대체합니다.
적극적인 자동 일시 중단 정책 설정: 유휴 컴퓨팅 시간에 대한 비용이 발생하지 않도록 모든 웨어하우스의 자동 일시 중단 시간 제한을 60초로 설정합니다.
클러스터링 키 사용: 매우 큰 테이블(멀티 테라바이트)의 경우 클러스터링 키를 정의하여 고도로 필터링된 쿼리의 성능을 개선합니다.
장기적인 FinOps 및 거버넌스 구축:
비용 모니터링: Snowflake의 ACCOUNT_USAGE 스키마 및 리소스 모니터를 통해 크레딧 사용량을 추적합니다.
보안 개선: 역할과 권한을 정기적으로 감사합니다. 민감한 데이터에 대한 동적 데이터 마스킹 및 행 액세스 정책과 같은 고급 보안 기능을 구현합니다.
부록¶
부록 1: Snowflake 및 Azure Synapse 아키텍처¶
특징 |
Azure 시냅스 분석 |
Snowflake |
|---|---|---|
아키텍처 |
제어 노드 + 컴퓨팅 노드(전용 풀의 경우 MPP). 분리된 저장소이지만 풀 내에서 결합된 컴퓨팅임. |
분리된 컴퓨팅, 저장소 및 클라우드 서비스(멀티 클러스터, 공유 데이터). |
저장소 |
SQL 풀에서 관리하는 Azure Data Lake Storage에 저장된 데이터. |
자동 마이크로 파티셔닝을 사용하는 중앙 집중식 오브젝트 저장소(Azure Blob). |
컴퓨팅 |
프로비저닝된 전용 SQL 풀(DWUs에 의해 확장됨 ) 또는 서버리스 SQL 풀(쿼리당 지불). |
탄력적인 온디맨드 가상 웨어하우스(컴퓨팅 클러스터). |
동시성 |
전용 풀에서 DWU 크기 및 최대 동시 쿼리 슬롯(128)으로 제한됨. |
자동으로 가동되는 멀티 클러스터 웨어하우스를 통한 높은 동시성. |
확장성 |
DWUs를 변경하여 전용 풀 확장(몇 분 정도 걸릴 수 있음). 일시 중지할 수 있음. |
컴퓨팅을 즉시 확장, 축소 및 수평 확장하며 저장소는 자동으로 확장됨. |
유지 관리 |
통계를 수동으로 유지 관리해야 함. 인덱싱 전략에 관리가 필요함. |
완전 관리되며, 통계 및 압축과 같은 유지 관리 작업이 자동화됨. |
부록 2: 데이터 타입 매핑¶
Azure Synapse(T-SQL) |
Snowflake |
참고 |
|---|---|---|
bigint |
BIGINT 및 NUMBER(19,0) |
|
int |
INT 및 NUMBER(10,0) |
|
smallint |
SMALLINT 및 NUMBER(5,0) |
|
tinyint |
TINYINT 및 NUMBER(3,0) |
|
bit |
BOOLEAN |
|
decimal(p,s) 및 numeric(p,s) |
NUMBER(p,s) |
|
money 및 smallmoney |
NUMBER(19,4) 및 NUMBER(10,4) |
모범 사례는 NUMBER에 매핑하는 것입니다. |
float 및 real |
FLOAT |
|
날짜 |
DATE |
|
datetime 및 datetime2 |
DATETIME / TIMESTAMP_NTZ |
TIMESTAMP_NTZ는 선호되는 대상인 경우가 많습니다. |
datetimeoffset |
TIMESTAMP_TZ |
|
smalldatetime |
DATETIME / TIMESTAMP_NTZ |
|
시간 |
TIME |
|
char(n) 및 varchar(n) |
VARCHAR(n) |
|
nchar(n) 및 nvarchar(n) |
VARCHAR(n) |
Snowflake는 기본적으로 UTF-8을 사용하므로 N개의 접두사 유형이 필요하지 않습니다. |
text 및 ntext |
VARCHAR |
더 이상 사용되지 않는 유형으로 VARCHAR에 매핑합니다. |
binary(n) 및 varbinary(n) |
BINARY(n) |
|
uniqueidentifier |
VARCHAR(36) |
문자열로 저장하고 필요한 경우 UUID_STRING()을 사용합니다. |
부록 3: SQL 및 함수의 차이점¶
Azure Synapse(T-SQL) |
Snowflake |
참고 |
|---|---|---|
GETDATE() |
CURRENT_TIMESTAMP() |
Snowflake에는 현재 날짜 및 시간에 대한 여러 함수가 있습니다. |
ISNULL(expr1, expr2) |
IFNULL(expr1, expr2) |
COALESCE는 ANSI 표준이며 둘 다에서 작동합니다. |
TOP (n) |
LIMIT n |
Snowflake는 쿼리 끝에 LIMIT 절을 사용합니다. |
IIF(bool, true, false) |
IFF(bool, true, false) |
기능은 동일하며 이름은 약간 다릅니다. |
DATEADD(part, num, date) |
DATEADD(part, num, date) |
지원되지만, 날짜 및 시간 부분의 이름이 다를 수 있습니다(예: dd 및 day 비교). |
DATEDIFF(part, start, end) |
DATEDIFF(part, start, end) |
지원되지만, 날짜 및 시간 부분의 이름이 다를 수 있습니다. |
STRING_SPLIT |
SPLIT_TO_TABLE / SPLIT |
Snowflake에는 문자열 분할을 위한 보다 강력한 함수가 있습니다. |
프로시저 언어 |
T-SQL(저장 프로시저) |
Snowflake Scripting, JavaScript, Java, Python |
DDL 절 |
DISTRIBUTION, CLUSTERED COLUMNSTORE INDEX |
없습니다. 자동 마이크로 파티셔닝 및 선택적 클러스터링 키로 대체되었습니다. |
임시 테이블 |
#temptable |
CREATE TEMPORARY TABLE |
트랜잭션 |
BEGIN TRAN, COMMIT, ROLLBACK |
BEGIN, COMMIT, ROLLBACK |
오류 처리: |
TRY…CATCH |
BEGIN…EXCEPTION…END |