프로젝트를 진행하면서 snowflake를 활용하여 데이터 웨어하우스 구축에 사용했던 것들을 모아서 정리하였습니다.

Colab을 활용하여 snowflake조작하기

: snowflake에 데이터를 colab으로 넣을 수 없을까 생각하다가 찾았던 라이브러리이다. 그러나 실사용에서는 snowflake의 웹을 통해서 넣는 것이 편해 잘 사용되지는 않았다.

  • 설치
%pip install snowflake-connector-python
import snowflake.connector

 

  •  계정 정보를 입력해서 연결 수행
ctx = snowflake.connector.connect(
    user='<user_name>',
    password='<password>',
    account='<account_name>'
    )
cs = ctx.cursor()
try:
    cs.execute("SELECT current_version()")
    one_row = cs.fetchone()
    print(one_row[0])
finally:
    cs.close()
ctx.close()
  • SQL 입력
cs.cusor().execute(query)

 

추가 정보는 다음 블로그를 참고 : Snowflake Python에서 사용하는 법(Python Connector, Snowpark)

S3와 연결

: 연결과정의 경우 블로그의 글을 참고하며, 실제로 사용하였고, 동작한 코드위주로 정리글을 남긴다.

클라우드와 s3를 연결하기위해서는 3가지의 과정이 필요하다.

Integration → staging → COPY INTO

IAM Policy 구성

: S3폴더에 액세스 하려면 몇가지 권한이 필요하다.

  • s3:GetBucketLocation
  • s3:GetObject
  • s3:GetObjectVersion
  • s3:ListBucket
  • s3:PutObject
  • s3:DeleteObject

JSON코드로 정책을 생성하면 다음과 같다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:GetObjectVersion",
              "s3:DeleteObject",
              "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::<bucket>",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "<prefix>/*"
                    ]
                }
            }
        }
    ]
}

에는 권한을 갖는 s3버킷을 입력하고, 에는 오브젝트의 경로를 입력한다.

Integration

: 클라우드의 키나 액세스 토큰같은 자격 증명을 전달하지 않고도 연결을 수행하게 해주는 개체이다. 이를 이용하면 자격 증명 정보를 코드에 넣지 않고도 클라우드와의 연결이 가능해진다.

-- integration
CREATE STORAGE INTEGRATION s3_connect
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = '<aws_role_arn>'
  STORAGE_ALLOWED_LOCATIONS = ('<s3_bucket_location>');

STAGING

: 파일을 snowflake로 로드하기 전에 임시로 저장하는 영역을 생성한다. 종류는 사용자, 테이블, 외부 stage가 있다.

-- staging
USE SCHEMA DATABASE_PROJECT.RAW_DATA;

CREATE STAGE my_s3_stage
  STORAGE_INTEGRATION = s3_connect
  URL = '<s3_bucket_location>';

COPY INTO

  • load
-- 로드
COPY INTO SCHEMA.TABLE_NAME
FROM <파일 경로>
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1); --첫 줄의 헤더를 스킵하는 포맷
  • unload
-- CSV 형식으로 언로드
COPY INTO @my_ext_unload_stage/TABLE_NAME
FROM TABLE_NAME
FILE_FORMAT = (TYPE = 'CSV' FIELD_OPTIONALLY_ENCLOSED_BY = '"' FIELD_DELIMITER = ',' COMPRESSION = 'NONE');
-- SINGLE = TRUE; single로 하게되면 파일 하나로 언로드된다.

참고 및 출처) Amazon S3에 액세스하도록 Snowflake 설정하기

'Others > Cloud' 카테고리의 다른 글

Cloud - Snowflake(1) 소개  (0) 2024.03.18
Cloud - Redshift 보안, Spectrum, ML, 중지  (0) 2024.03.15
Cloud - Redshift & S3 connect  (0) 2024.03.15

Snowflake 소개

  • 데이터 클라우드, 다른 글로벌 클라우드 위에서 동작
  • 데이터의 판매가 가능한 Data Sharing/Marketing 제공
  • ETL, 데이터 통합 기능 제공

특징

  • 가변 비용 모델이다.
  • SQL 기반으로 빅데이터를 저장, 처리한다.
  • 배치 데이터 중심이나, 실시간 데이터도 지원한다.
  • Time Travel : 과거 데이터 쿼리 기능을 지원한다.
  • Python API를 통해서 관리/제어가 가능하다.
  • 클라우드 스토리지를 외부 테이블로 사용가능하다.
  • 계정 구성
    • Organization : 모든 Snowflake 자원들을 통합하는 최상위 컨테이너
    • Accounts : 자체 사용자, 데이터, 접근 권한을 독립적으로 갖는다.
    • Databases : 하나의 Database는 다수의 스키마와 테이블, 뷰로 구성됨, 독립적인 컴퓨팅 리소스를 갖는다.
  • Data Sharing & Marketplace
    • Sharing : 데이터 셋을 스토리지 레벨에서 공유한다.
    • Marketplace : 데이터 판매가 가능한 마켓플레이스 제공
  • 비용 구조
    • credit : 작업에 소비되는 계산 리소스를 측정하는 단위
    • 컴퓨팅 비용 : 크레딧으로 결정된다.
    • 스토리지 비용 : TB 단위 계산
    • 네트워크 비용 : 지역간 데이터 전송 또는 다른 클라우드간 전송 시 TB단위 계산

초기 환경 설정

  1. Worksheets에서 SQL Worksheet를 생성
  2. Setup-Env를 Rename으로 생성해주기.
  3. No Database selected → db를 선택해야한다. (생성)

데이터 베이스와 스키마 설정

CREATE DATABASE dev;
CREATE SCHEMA dev.raw_data;
/*미리 db를 설정한 경우에는 아래와 같이 사용된다.*/
CREATE SCHEMA raw_data

 

  • 테이블을 raw_data 아래에 생성(dev선택했다는 가정하에)
--만약에 테이블이 존재하면 지우고 새로만든다.-> CREATE OR REPLACE TABLE
CREATE OR REPLACE TABLE raw_data.session_transaction( 
	sessionid varchar(32) primary key,
	refunded boolean,
	amount int
);
  • COPY 사용해 벌크 업데이트 수행하기
    • S3 버킷 액세스를 위한 전용 사용자를 IAM으로 만들고 S3 읽기 권한 부여가 필요.
      • 권한 옵션에서 Attach policies directly → S3ReadOnlyAccess 추가
    • 사용자의 키가 필요하다.
      • IAM 사용자 → Security credentials → create access key
        • AWS_KEY_ID
        • AWS_SECRET_KEY
COPY INTO dev.raw_data.session_timestamp
FROM 'S3의 파일 경로'
credentials = (AWS_KEY_ID = '' AWS_SECRET_KEY = '')
FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='''');

사용자 권한 설정과 데이터 거버넌스

  • Snowflake는 Group을 지원하지 않는다. → Role을 사용

Role과 User 생성

  • ROLE : CREATE ROLE user_role
  • USER : CREATE USER username PASSWORD =’password’;
  • 권한 지정 : GRANT ROLE user_role TO USER username
    • 기본이 되는 role 하위에 새로운 role 생성을 하는 경우
      : GRANT ROLE parents_role TO ROLE child_role;
  • 보안의 경우 별도 테이블 관리가 좋다.

데이터 거버넌스

  • 데이터가 적재적소에 올바르게 사용됨을 보장하기 위한 데이터 관리 프로세스
  • 목적은 아래와 같다.
    • 데이터 기반 결정에서의 일관성
    • 데이터를 이용한 가치 만들기
    • 데이터 관련 법규 준수

데이터 거버넌스 관련 기능

  • Object Tagging
    • 각 오브젝트에 태그를 달아서 관리하는 것.
    • 개인 정보에 관련된 부분을 관리하는 것이 중요하다.
    • Enterprise 레벨에서만 가능하다. CREATE TAG로 생성한다.
      • tag는 구조를 따라서 계승된다.
  • Data Classification
    • Snowflake가 직접 데이터를 분류해주는 것
    • 3가지의 스텝으로 구성된다.
      • Analyze : 테이블 적용 시 특정 컬럼들을 분류한다. (개인정보, 민감한 정보들)
      • Review : 사람이 보고 최종 리뷰 수행
      • Apply : 최종 결과를 System Tag로 적용한다.
  • Tag based Masking Policies
    • 태그에 따라서 액세스 권한을 다르게 해주는 것.
  • Access History : 접근 기록 확인
  • Object Dependencies
    • 원본 테이블의 속성들이 새로운 테이블을 생성 시에 따라가야 한다. → 시스템 무결성 유지가 목적
    • 계승 관계 분석을 통해 세밀한 보안과 액세스 제거가 가능하다.
    • 테이블이나 뷰를 수정하는 경우 발생하는 영향을 식별해준다.

'Others > Cloud' 카테고리의 다른 글

Cloud - Snowflake(2) 조작하기  (0) 2024.03.18
Cloud - Redshift 보안, Spectrum, ML, 중지  (0) 2024.03.15
Cloud - Redshift & S3 connect  (0) 2024.03.15

Redshift 보안 및 백업

권한과 보안

  • 사용자별 테이블 권한 설정
    • 일반적으로 사용자별 테이블별 권한 설정은 하지 않는다.
    • 역할이나 그룹별로 스키마 접근 권한을 주는 경우가 많다. (RBAC : Role Based Access Control을 많이 쓴다.)
    • 개인정보에 관련된 테이블의 경우 별도 스키마를 설정한다.
    • 코드 예시
/*두번쨰 명령이 메인 명령이다.*/ 
/*그룹에 대해서 스키마 권한을 주고, 스키마 내의 테이블의 권한을 부여한다.*/ 
GRANT USAGE ON SCHEMA analytics TO GROUP analytics_authors
GRANT SELECT ON ALL TABLES IN SCHEMA analytics TO GROUP analytics_users;
GRANT ALL ON ALL TABLES IN SCHEMA adhoc TO GROUP analytics_users
GRANT ALL ON SCHEMA adhoc to GROUP analytics_users;

 

 

  • 컬럼 레벨 보안 : 테이블 내의 특정 컬럼을 사용자나 특정 그룹에만 접근하도록 만드는 것.
    • 보안이 필요한 컬럼을 별도 테이블로 생성하는 방법을 사용한다
    • 가장 좋은 것은 보안이 필요한 정보를 데이터 시스템으로 로딩하지 않는 것이다.
  • 레코드(Row) 레벨 보안 : 특정 레코드들을 사용자나 특정한 그룹에만 접근하도록 만드는 것.
    • 특정 사용자의 테이블을 대상으로하는 SELECT, UPDATE, DELETE 작업에 추가 조건을 다는 형태로 동작한다.
    • 생성 : CREATE RLS POLICY 명령을 사용한다.
    • 부여 : ATTACH RLS POLICY

 

백업과 테이블 복구

  • 고정 비용 Redshift
    • Snapshot : 마지막 백업으로부터 바뀐 것들만 저장하는 방식 → 과거 시점의 내용으로 클러스터 생성도 가능하다.
    • 자동 백업 : 최대 35일까지의 변경을 백업하도록 할 수 있다.
      • 다른 지역의 S3에 하려면 Cros-regional snapshot copy를 설정해야한다. → 재난 상황같은 경우에 유용하다.
      • Redshift 클러스터의 Maintenance → Backup details → Edit을 통해 보관 기간을 설정한다.
    • 매뉴얼 백업 : 원하는 경우에 만드는 백업이다. 명시적으로 삭제 전까지 유지된다.
    • 백업에서 테이블 복구
      • Restore table 선택 → 복구 대상이 있는 Snapshot선택
      • 원본 테이블을 선택하고 복구 할 타겟 테이블을 선택한다.
  • 가변 비용 Redshift Serverless
    • Snapshot 이전에 Recovery Points가 존재한다. (24시간만 유지된다.)
    • 자동으로 Snapshot이 생기지 않기 때문에 직접 생성해주어야한다.
    • Recovery points를 통해서 snapshot을 생성하는 것과 달리 Snapsots에서 직접 생성하게되면 메뉴얼 백업이 생성된다.

Redshift Spectrum

  • S3에 매우 큰 데이터가 있어 Redshift에 로딩하기 버거운 경우에 사용한다.

Fact, Dimension 테이블

  • Fact : 분석의 초점이되는 양적 정보를 포함하는 중앙 테이블
    • 보통 비즈니스 결정에 사용되는 테이블
    • 외래 키를 통해서 여러 Dimension 테이블에 연결된다.
    • Fact 테이블의 크기가 DImension 테이블보다 큰 경우가 많다.
    • 예) Order 테이블, 상품 주문 정보가 들어간 테이블
  • DImension : Fact 테이블에 대한 상세 정보를 제공하는 테이블
    • 사용자가 다양한 방식으로 Fact 테이블의 데이터를 조각내어 분석하게 해준다.
    • Dimension 테이블은 PK를 갖는다.
    • 예) User 테이블, Order테이블에서 주문을 한 사용자에 대한 정보

Spectrum use case

  • S3에 대용량 Fact 테이블이 존재
  • Fact 테이블을 Redshift로 적재하지 않고 사용하는 경우
  • 별도 설정 하는 것이 아니라 Redshift의 확장기능이다.
  • 외부 테이블
    • DB엔진이 외부에 저장된 데이터를 내부 테이블처럼 사용하는 방법
    • SQL을 사용해서 DB에 외부 테이블 생성이 가능하다.
    • 데이터 러치 후 결과를 DB에 적재하는데 사용한다.
    • 보안적인 부분에서 고려가 필요하다.
    • S3 Fact 데이터를 외부 테이블로 정의해야한다.

Redshift ML

AWS SageMaker

  • ML 모델 개발을 처음부터 끝까지 지원하는 서비스 (MLOps 프레임워크)
  • 4가지의 기능을 제공한다.
    • 트레이닝 셋 준비
    • 모델 훈련
    • 모델 검증
    • 모델 배포와 관리
  • 다양한 머신러닝 프레임워크를 지원한다.
  • 다양한 개발방식을 지원한다.
  • AutoPilot : AutoML 기능 → 데이터 셋을 제공하면 자동으로 모델을 제작해준다.
  • 사용 권한 지정 → Redshift cluster
    1. Role 설정
    2. Role을 사용할 수 있는 서비스로 Redshift를 지정
    3. Redshift 권한으로 지정 (SagemakerFullAccess)
      1. Principal에 있어서 sagemaker와 redshift가 모두 access 가능하게 변경해주어야 한다.
    4. ARN을 통해 활용

Redshift 중지/제거하기

  • 가변 비용에는 제거만 있다.

유지보수

  • 고정 비용 옵션에서만 있음.
  • Maintenance window라고 부른다.

테이블 청소와 최적화 - VACUUM

  • 테이블 데이터 정렬 → 데이터를 정렬해서 남아있는 행을 모아준다.
  • 디스크 공간 해제 : 필요하지 않은 행들을 제거한다.

클러스터 중지&제거

  • 중지 : 당분간 필요 없는 경우에 사용한다. → 스토리지 비용만 부담하게된다.
  • 제거 : 아에 필요없는 경우에 사용한다. Snapshot으로 s3에 저장할 것인지를 물어본다.

'Others > Cloud' 카테고리의 다른 글

Cloud - Snowflake(2) 조작하기  (0) 2024.03.18
Cloud - Snowflake(1) 소개  (0) 2024.03.18
Cloud - Redshift & S3 connect  (0) 2024.03.15

Redshift 소개

특징

  • AWS에서 지원하는 데이터 웨어하우스 서비스
  • Still OLAP : 응답 속도가 느려서 프로덕션 DB로 사용하기 힘들다.
  • 컬럼 기반의 스토리지 : 컬럼별 압축이 가능하며, 컬럼의 추가와 삭제가 빠르다.
  • 벌크 업데이트 지원 : S3와 연계해서 Copy 커맨드로 Redshfit에 복사가 가능하다.
  • Datashare 지원
  • PK uniqueness를 보장하지 않는다.
  • SQL 기반이며 PostgreSQL 8.x을 호환한다.
  • 두 대 이상의 노드로 구성되면 복잡해진다.
    • 분산 저장되어야 한다.
    • 노드에 데이터가 적절하게 분배되도록 사용자가 지정해주어야한다.
  • 레코드 분배와 저장 방식
    • 두 대 이상의 노드로 구성되면 테이블 최적화가 중요하다.
      • Distkey : 레코드가 어떤 컬럼을 기준으로 배포되는지 나타낸다. → DIststyle이 key → 컬럼 선택이 중요하다. (Skew : 한쪽 쏠림 이 발생가능하다.)
      • Diststyle : 레코드 분배 방식을 결정 (all, even, key)
      • Sortkey : 레코드가 한 노드 안에서 어떤 컬럼을 기준으로 정렬되는지 나타낸다. (타임스탬프가 되는 경우가 많음)
  • Redshift의 벌크 업데이트 방식
    1. 데이터 추출
    2. 파이프라인을 통해 S3에 업데이트
    3. S3 → Redshift로 복사

참고) VARCHAR의 경우 한중일 언어는 1CHAR가 3Byte이기 때문에 주의해야 한다.

  • 고급 데이터 타입
    • GEOMETRY
    • HLLSKETCH
    • SUPER
    • JSON은 VARCHAR로 받아서 Parsing을 해야한다.

Serverless 설치

주의) 3달 or $300 비용 초과인 경우에 Free Trial이 만료됨!

참고) 비용 측면에서 free trial은 서울이 비싸기 때문에 오레곤으로 시작했다.

  • Colab 연결
    • 엔드 포인트
    • Admin 계정 생성
    • 연결을 위해 endpoint, username, password 정보가 필요하다.
    • Public access 설정
      - 작업 그룹 구성에 진입
      - 네트워크 및 보안의 퍼블릭 액세스를 켜야한다.

      - VPC 보안 그룹의 세팅 변경이 필요하다.
      - 인바운드 규칙 변경
      - 규칙 추가를 진행 → 포트 넘버 5439 선택, 소스의 경우 모든 접근을 설정하기 위해 0.0.0.0으로 설정한다.

초기설정

  • 스키마 : 폴더 컨셉의 구조 생성
    • 목적에 맞는 스키마를 생성한다.
    • 생성 : CREATE SCHEMA <schema_name>
    • 리스트하기 : SELECT * FROM pg_namespace;
    • public은 default 스키마다.
  • 그룹
    • 한 사용자는 다수의 그룹에 속할 수 있다.
    • 그룹은 계승이 안되기 때문에 관리가 필요하다.
    • 그룹을 활용해 접근권한을 설정하는 방식을 많이 사용한다.
    • 그룹 생성 : CREATE GROUP
    • 그룹에 사용자 추가 : ALTER GROUP group_name ADD USER username
    • 그룹 리스트하기 : SELECT * FROM pg_group;
    • 접근 권한은 grant를 사용해서 부여한다.
  • 역할 설정
    • 그룹과 다르게 계승 구조가 가능하다.
    • 사용자에게 부여될 수도 있고, 역할에 부여도 가능하다.
    • 한 사용자가 다수의 역할에 소속가능하다.
    • 역할 리스트 : SELECT * FROM SVV_ROLES;
    • 역할 생성 : CREATE ROLE role_name
    • 부여 : GRANT ROLE staff TO ROLE role_name 또는 TO username
  • 유저 생성
    • 사용자 리스트하기 : SELECT * FROM pg_user;
    • 사용자 생성 : CREATE USER username password ‘…’;

Copy 명령으로 테이블에 레코드 적재하기

  • raw_data 테이블 생성하기 : ETL을 통해 데이터 소스를 복사하는 형태로 이루어진다.
    • S3에서 Redshift에 접근하기 위해서는 접근 권한 생성이 필요
      • IAM → 역할 생성
        1. AWS service를 선택하고 하단의 Redshift를 선택한다.
        2. 다음으로 Redshift가 갖게 될 권한을 선택해야한다. → 이번에는 AmazonS3FullAccess를 선택하여 진행한다.
        3. 사용할 역할 이름을 입력하고 최종 생성한다.
      • Redshift → 네임스페이스 구성에 접근
        1. 보안 및 암호화에 IAM 역할관리를 선택
        2. IAM 역할 연결을 선택하고, 앞서 만든 IAM을 지정한다.
    • COPY 명령을 사용하여 raw_data 스키마 아래의 3개 테이블에 레코드를 적재합니다.
  • analytics 테스트 테이블 생성하기
    • raw_data에 있는 테이블들을 조인해서 새로 만든다. or CTAS로 가능하다. 
  CREATE TABLE analytics.mau_summary AS
      SELECT
      	TO_CHAR(A.ts,'YYYY-MM') AS month,
      	COUNT(DISTINCT B.userid) AS mau
      FROM raw_data.session_timestamp A
      JOIN raw_data.usersession_channel B ON A.sessionid = B.sessionid
      GROUP BY 1
      ORDER BY 1 DESC;

 

'Others > Cloud' 카테고리의 다른 글

Cloud - Snowflake(2) 조작하기  (0) 2024.03.18
Cloud - Snowflake(1) 소개  (0) 2024.03.18
Cloud - Redshift 보안, Spectrum, ML, 중지  (0) 2024.03.15

+ Recent posts