[Snowflake] GCS To Snowflake(Bulk Loading)

Jaewon Lim·2025년 2월 7일
0

Snowflake❄️

목록 보기
3/7
post-thumbnail

Intro

COPY 명령을 사용하여 로컬 파일 시스템 내부(즉, Snowflake 관리) 스테이지에서 데이터를 테이블로 대량 로딩하는 방법과 다르게, 250MB를 초과하는 대량의 데이터는 Google Cloud Storage 버킷을 이용하여 Snowflake로 대량 로드하기 위한 경로를 사용할 수 있다.

지원되는 파일 형식

정형
구분 기호로 분리된 타입(CSV,TSV 등) : 모든 유요한 1바이트 구분 기호가 지원된다. 기본값은 쉼표(즉, CSV)이다.

반정형
JSON, Avro, ORC, Parquet : 각 최상위 전체 오브젝트는 테이블에서 별도의 행으로 로드된다. 각 오브젝트에는 줄 바꿈 문자와 공백을 포함할 수 있지만, 오브젝트가 유효해야 한다.
XML : 각 최상위 요소는 테이블에서 별도의 행으로 로드된다. 요소는 이름이 동일한 시작 및 닫기 태그로 식별된다 .
Snowflake는 반정형 데이터를 VARIANT 타입의 열에 직접 로드할 수 있도록 지원한다.

과정

우선 위의 사진과 같이 Google Cloud Storage에 버킷(hype_data)을 생성하고 250MB가 넘는 파일 3개를 업로드 했다는 가정하고 진행한다.

1. 클라우드 스토리지 통합 만들기

스노우플레이크와 외부 클라우드 저장소(GCS)를 연결 시킬 수 있는 다리를 생성하는 단계이다.

CREATE STORAGE INTEGRATION 명령문은 외부 클라우드 저장소(GCS)에 대한 인증 책임을 Snowflake 생성 엔터티에 위임하는 Snowflake 오브젝트이다. GCS 버킷에 액세스 하기 위해 Snowflake는 데이터 파일을 저장하는 버킷에 액세스할 수 있는 권한을 부여할 수 있는 서비스 계정을 생성한다.

데이터 웨어하우스 플랫폼이 외부 클라우드 스토리지 서비스(GCS,S3)에 접근하여 데이터를 읽거나 쓸 수 있도록 연결 정보와 권한을 구성하는 기능. 이 구성을 통해 데이터 웨어하우스는 외부 스토리지에 저장된 데이터를 직접 쿼리하거나, 데이터를 외부로 내보내는 등의 작업을 수행할 수 있다.

단일 스토리지 통합은 여러 외부(즉, GCS) 스테이지를 지원할 수 있다. GCS 내에 여러 버킷을 만들고 버킷의 URL을 STORAGE_ALLOWED_LOCATIONS 매개 변수에 지정된 GCS 버킷과 일치하면 가능하다.

-- 스토리지 통합
CREATE STORAGE INTEGRATION GCP_INTEGRATION
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://hype_data');

Storage
데이터를 저장하기 위한 공간 또는 서비스를 위미. 클라우드 환경에서는 GCS, S3, Azure Blob 등과 같이 대용량의 데이터를 저장할 수 있는 공간을 제공한다. 이러한 저장소는 데이터를 안전하게 보관하며, 언제 어디서나 접근할 수 있게 해준다.

Integration
다른 시스템이나 플랫폼과 연결하여 데이터를 교환하거나 기능을 확장할 수 있도록 하는 방법 또는 도구이다. 특히, 데이터 관리 및 분석 플랫폼에서는 외부 데이터 소스나 다른 클라우드 서비스와의 연결을 위해 인테그레이션을 설정한다.

-- 스테이지 생성
CREATE STAGE my_gcs_stage
  URL = 'gcs://hype_data'
  STORAGE_INTEGRATION = GCP_INTEGRATION;

2.GCS 버킷에 사용자 지정 역할 할당

만들어 놓은 다리를 건너기 위해 통과할 수 있는 사람인지 신원을 확인하는 단계이다.

DESC STORAGE INTEGRATION GCP_INTEGRATION;
propertyproperty_typeproperty_valueproperty_default
ENABLEDBooleantruefalse
STORAGE_PROVIDERStringGCS
STORAGE_ALLOWED_LOCATIONSListgcs://hype_data[]
STORAGE_BLOCKED_LOCATIONSList[]
STORAGE_GCP_SERVICE_ACCOUNTStringservice-account-id@project1-123456.iam.gserviceaccount.com
COMMENTString

위의 명령어는 Snowflake 계정에 대해 자동으로 생성된 클라우드 저장소 서비스 계정에 대한 ID 를 검색한다. Snowflake 계정에 대해 단일 클라우드 스토리지 통합은 해당 서비스 계정을 사용한다.

GCP 에서 애플리케이션, 가상 머신, 다른 서비스 또는 인프라가 사용자가 직접 개입하지 않고도 Google 서비스에 안전하게 액세스할 수 있게 해주는 특별한 종류의 계정이다.

  • 사용 목적
    • API 접근 권한관리 : GCP 내 또는 외부의 다른 서비스와 상호작용 시, API 호출 권한을 관리함
    • 자동화된 테스크 : 배치 작업, 데이터 처리 및 서버리스 애플리케이션 같은 자동화된 테스크를 실행
    • 외부 자원 접근 : 외부 데이터 웨어하우스 서비스로의 데이터 이동

3. 서비스 계정에 버킷 오브젝트 액세스 권한 부여

서비스 계정에 Google Cloud Storage에 접근할 수 있도록 임명하면서 어떠한 권한을 줄지 설정하는 단계이다.

클라우드 저장소 버킷을 사용하여 데이터를 로드 및 언로드할 수 있도록 Google Cloud Plateform 콘솔에서 Snowflake에 대한 IAM 액세스 허가를 구성하는 방법을 설명한다.

3.1 IAM & Admin -> Roles

3.2 CREATE ROLE

3.3 Title & ID

3.4 ADD PERMISSIONS

스노우플레이크의 서비스 계정에게 GCS의 데이터에 대해 어떠한 권한을 줄 수 있는지 설정한다.

작업필수 권한
데이터 로딩 전용storage.buckets.get
storage.objects.get
storage.objects.list
제거 옵션을 사용한 데이터 로딩으로 스테이지에서 REMOVE 명령 실행storage.buckets.get
storage.objects.delete
storage.objects.get
storage.objects.list
데이터 로딩 및 언로딩storage.buckets.get (데이터 전송 비용 계산용)
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.list
데이터 언로딩 전용storage.buckets.get
storage.objects.create
storage.objects.delete
storage.objects.list

3.5 CREATE


4. 클라우드 스토리지를 서비스 계정에 사용자 지정 역할 할당하기

GCP에서 새로 설정한 나만의 권한을 스노우플레이크의 서비스 계정에게 주고 그 계정이 버킷에 접근할 수 있도록 한다.

4.1 GRANT ACCESS

사용하고자 하는 버킷을 선택 후 권한을 부여한다.

4.2 Add Principals

New principals 공간에 2단계에서 보았던 STORAGE_GCP_SERVICE_ACCOUNT 를 입력 후, 3단계에서 만든 권한을 선택한다.

5. 외부 스테이지 만들기

외부(GCS) 데이터에서 가져온 데이터를 담아 둘 스테이지를 만드는 과정이다.

CREATE STAGE MY_GCS_STAGE
  URL = 'gcs://hype_data'
  STORAGE_INTEGRATION = GCP_INTEGRATION;

⚠️ 주의

  • 지정된 폴더 경로로 필터링할 URL 값에 슬래시(/)를 추가한다. 슬래시를 생략하면 지정된 경로의 접두사로 시작하는 모든 파일과 폴더가 포함됨.
  • STORAGE_INTEGRATION 매개 변수가 설정되더라도, 이것이 FILE_FORMAT 이나 다른 스테이지 설정에 영향을 주지 않는다. STORAGE_INTEGRATION 은 주로 접근 권한과 위치 정보에 관련된 설정을 담당하며, 데이터 형식을 다루는 FILE_FORMAT 등의 매개변수는 그와 독립적으로 다뤄짐.

❗ 참고

  • DB와 스키마에 대한 USAGE 권한과 스키마에 대한 CREATE STAGE 권한이 부여되거나 이러한 권한을 상속하는 역할을 사용해야한다. 스테이지 소유자(즉, 스테이지에서 OWNERSHIP 권한 역할)는 스토리지 통합에 대한 USAGE 권한도 있어야한다.
  • 통합을 사용하는 스테이지에 데이터를 로드하거나 스테이지에서 언로드하려면 역할에 해당 스테이지에 대한 USAGE 권한이 있어야한다. 스토리지 통합에 대한 USAGE 권하도 가질 필요는 없다.
-- 사용 중인 역할에 저장소 통합을 사용하는 스테이지를 생성하는 데 필요한 권한이 부여되거나 상속되도록 함.
GRANT USAGE ON DATABASE PROJECT TO ROLE myrole;
GRANT USAGE ON SCHEMA PROJECT.stages TO ROLE myrole;
GRANT CREATE STAGE ON SCHEMA PROJECT.stages TO ROLE myrole;
GRANT USAGE ON INTEGRATION GCP_INTEGRATION TO ROLE myrole;

6. 자동 갱신 설정

GCP에 새로운 데이터를 업로드 하고 스노우 플레이크 스테이지에 새롭게 갱신 시키는 단계이다.

외부 클라우드 스토리지의 파일 목록이 변경될 때 스노우플레이크의 디렉토리 테이블을 자동으로 갱신하여 최신 상태를 유지하게 된다.

ALTER STAGE MY_GCS_STAGE REFRESH;

결론을 내리자면!!

  1. 스노우플레이크와 외부 클라우드 저장소(GCS)를 연결 시킬 수 있는 다리를 생성하는 단계
  2. 만들어 놓은 다리를 건너기 위해 통과할 수 있는 사람인지 신원을 확인하는 단계
  3. 서비스 계정에 Google Cloud Storage에 접근할 수 있도록 임명하면서 어떠한 권한을 줄지 설정하는 단계
  4. GCP에서 새로 설정한 나만의 권한을 스노우플레이크의 서비스 계정에게 주고 그 계정이 버킷에 접근
  5. 외부(GCS) 데이터에서 가져온 데이터를 담아 둘 스테이지를 만드는 과정
  6. GCP에 새로운 데이터를 업로드 하고 스노우 플레이크 스테이지에 새롭게 갱신 시키는 단계

추가

-- 스토리지 통합 설명 조회
DESC INTEGRATION GCP_INTEGRATION;
-- Role 사용 권한 확인
SHOW GRANTS ON INTEGRATION GCP_INTEGRATION;

참고 자료

https://snowflakewiki.medium.com/connecting-snowflake-to-google-cloud-storage-9b3f1314de9

0개의 댓글