Redshift 고급 기능 실습 (TIL 28)

석형원·2024년 5월 10일

TIL

목록 보기
28/52

✏️ 오늘 학습한 내용

1. Redshift 권한과 보안
2. Redshift 백업과 테이블 복구
3. Redshift 관련 기타 서비스
4. Redshift Spectrum 사용
5. Redshift ML 사용
6. Redshift 중지/제거


🔎 Redshift 권한과 보안

📃 사용자별 테이블 권한 설정

  • 일반적으로 사용자별 테이블별 권한 설정은 하지 않음

    • 너무 복잡해지고 실수의 가능성이 높아짐
  • 역할(Role) 혹은 그룹(Group) 별로 스키마별 접근 권한을 주는 것이 일반적

    • RBAC(Role Based Access Control)가 새로운 트렌드
      -> 그룹보다 편리

    • 여러 역할에 속한 사용자의 경우는 각 역할의 권한을 모두 갖게 됩니다. (Inclusive)

  • 개인정보와 관련한 테이블들이라면 별도 스키마를 설정

    • 극히 일부의 사람만 속한 역할에 접근 권한을 줘야합니다.

📃 사용자 그룹 권한 설정

# ON ALL TABLES IN SCHEMA 명령어를 사용하기 위해선
# ON SCHEMA를 통해 사전에 스키마에 대한 액세스를 허가해줘야함

# 사용자 그룹 analytics_authors에게
# analytics 스키마에 접근 권한을 부여
GRANT ALL ON SCHEMA analytics TO GROUP analytics_authors;
# analytics 스키마 안의 모든 테이블에 대한 모든 권한을 부여
GRANT ALL ON ALL TABLES IN SCHEMA analytics TO GROUP analytics_authors;

GRANT ALL ON SCHEMA adhoc to GROUP analytics_authors;
GRANT ALL ON ALL TABLES IN SCHEMA adhoc TO GROUP analytics_authors;

# SELECT ON ALL TABLES IN SCHEMA을 통해 SELECT(읽기) 권한을 주기 위해선
# USAGE ON SCHEMA를 통해 사전을 USAGE 권한을 주어야함

# raw_data 스키마에 대한 읽기 권한을 위한 접근을 허용
GRANT USAGE ON SCHEMA raw_data TO GROUP analytics_authors;
# raw_data 스키마 안의 모든 테이블에 대한 읽기 권한만 부여
GRANT SELECT ON ALL TABLES IN SCHEMA raw_data TO GROUP analytics_authors;

📃 컬럼 레벨 보안 (Column Level Security)

  • 테이블 내의 특정 컬럼들을 특정 사용자나 특정 그룹/역할에만 접근 가능하게 하는 것

  • 보통 개인정보 등에 해당하는 컬럼을 권한이 없는 사용자들에게 감추는 목적으로 사용

    • 이 경우 컬럼이 실수로 노출될 가능성이 농후합니다.

    • 더 좋은 방법은 아예 그런 컬럼을 별도의 테이블로 구성하는 것입니다.

    • 가장 좋은 방법은 보안이 필요한 정보를 아예 데이터 시스템으로 로딩하지 않는 것!

📃 레코드 레벨 보안 (Row Level Security)

  • 테이블 내의 특정 레코드들을 특정 사용자나 특정 그룹/역할에만 접근 가능하게 하는 것

  • 특정 사용자/그룹의 특정 테이블 대상 SELECT, UPDATE, DELETE 작업에 추가 조건을 다는 형태로 동작

    • 이를 RLS (Record Level Security) Policy라고 부름

    • CREATE RLS POLICY 명령어를 사용하여 Policy를 만들고 이를 ATTACH RLS POLICY 명령어를 사용하여 특정 테이블에 추가

  • 일반적으로 더 좋은 방법은 아예 별도의 테이블로 관리하는 것!
    -> 가장 좋은 방법은 아예 데이터 시스템으로 로딩하지 않는 것!!!!


🔎 Redshift 백업과 테이블 복구

📃 Redshift가 지원하는 데이터 백업 방식

( 고정 비용 )

  • 기본적으로 백업 방식은 마지막 백업으로부터 바뀐 것들만 저장하는 방식

    • 이를 Snapshot이라 부름

    • 백업을 통해 과거로 돌아가 그 시점의 내용으로 특정 테이블을 복구하는 것이 가능 (Table Restore)

    • 과거 시점의 내용으로 Redshift 클러스터를 새롭게 생성하는 것도 가능

  • 자동 백업

    • 기본은 하루이지만 최대 과거 35일까지의 변경을 백업 가능

    • 이 경우 백업은 같은 지역에 있는 S3에 이뤄짐

    • 다른 지역에 있는 S3에 하려면 Cross-regional snapshot copy를 설정해야합니다.
      -> 이는 보통 재난 상황시 데이터 복구에 유용

  • 매뉴얼 백업

    • 언제든 원할 때 만드는 백업으로 명시적으로 삭제할 때까지 유지됨 ( 혹은 생성시 보존 기한 지정 )

📃 Redshift Serverless가 지원하는 데이터 백업 방식

( 가변 비용 )

  • 고정 비용 Redshift에 비하면 제한적이고 조금 더 복잡

  • Snapshot 이전에 Recovery Points가 존재

    • Recovery Point를 Snapshot으로 바꾼 다음에 여기서 테이블 복구하거나 새로운 Redshift 클러스터를 생성하는 것이 가능합니다.
  • Recovery Points는 과거 24시간에 대해서만 유지됨


🔎 Redshift 관련 기타 서비스

  • Redshift Spectrum : S3 등에 있는 파일들을 테이블처럼 사용 가능하게 해줍니다.

  • Redshift Serverless : 가변 비용 모델

  • Athena : Apache Presto를 서비스화

  • Redshift ML

📃 Redshift Spectrum

  • Redshift의 확장 기능

  • S3에 있는 파일들을 마치 테이블처럼 SQL로 처리 가능

    • S3 파일들을 외부 테이블들 (external table)로 처리하면서 Redshift 테이블과 조인 가능

    • 외부 테이블 (S3)들은 보통 Fact 테이블들이 되고 Redshift 테이블들은 Dimension 테이블

    • 1TB를 스캔할 때마다 $5 비용이 생김

  • 이를 사용하려면 Redshift 클러스터가 필요

    • S3와 Redshift 클러스터는 같은 region에 있어야한다.

📃 Redshift Serverless

  • Redshift의 경우 용량을 미리 결정하고 월정액 (Fixed Cost) 지급

  • Redshift Serverless는 반대로 쓴만큼 비용을 지불하는 옵션

    • BigQuery와 같은 사용한 자원에 따른 비용 산정 방식

    • 데이터 처리 크기와 특성에 따라 Auto Scaling 적용

📃 Athena

  • AWS의 Presto 서비스로 사실상 Redshift Spectrum과 비슷한 기능을 제공

  • S3에 있는 데이터들을 기반으로 SQL 쿼리 기능 제공

    • 이 경우 S3를 데이터 레이크라 볼 수 있음

📃 Redshift ML

  • AWS의 SageMaker에 의해 지원되는 기능

    • SageMaker는 Auto Pilot이라는 최적화된 모델을 자동 생성해주는 기능 제공
  • SQL만 사용하여 머신러닝 모델을 훈련하고 사용할 수 있게 해주는 Redshift 기능

  • 모델이 만들어져 있다면 이를 사용하는 것도 가능
    ( BYOM : Bring Your Own Model )


🔎 Redshift Spectrum 사용

S3에 굉장히 큰 데이터가 있는 경우, 이를 Redshift로 로딩하기가 버겁다면 (네트워크 비용이 높다면) 이를 외부 테이블로 설정해서 Redshift에서 조작이 가능합니다.

📃 Fact 테이블과 Dimension 테이블

  • Fact 테이블 : 분석의 초점이 되는 양적 정보를 포함하는 중앙 테이블

    • 일반적으로 굉장히 큰 테이블 (Fact > Dimension)

    • 매출 수익, 판매량 또는 이익과 같은 사실 또는 측정 항목을 포함하여 비즈니스 결정에 사용

    • Fact 테이블은 일반적으로 외래 키를 통해 여러 Dimension 테이블과 연결

  • Dimension 테이블 : Fact 테이블에 대한 상세 정보를 제공하는 테이블

    • 고객, 제품과 같은 테이블Fact 테이블에 대한 상세 정보 제공

    • Fact 테이블의 데이터에 맥락을 제공하여 사용자가 다양한 방식으로 데이터를 조각내고 분석을 가능하게 해줌

    • Dimension 테이블은 일반적으로 primary key를 가지며, Fact 테이블의 foreign key에서 참조

    • 보통 Dimension 테이블의 크기는 훨씬 더 작음

Spectrum과의 관계 :

Fact table은 굉장히 클 수 있기에 데이터 웨어하우스로 전부 로딩하는게 비용, 시간적인 측면에서 비효율적일 수 있습니다. 그렇기에 S3에 저장해놓고 필요할 때마다 로딩해서 프로세싱 후 Redshift에 저장하는 것이 일반적입니다.

크기가 훨씬 작은 Dimension 테이블의 경우에는 아예 Redshift에 처음부터 올려두어 join하는 형태로 많이 사용합니다.

📃 Fact 테이블과 Dimension 테이블 예시

  • Fact 테이블

    • Order 테이블 : 사용자들의 상품 주문에 대한 정보가 들어간 테이블
  • Dimension 테이블

    • Product 테이블 : Order 테이블에 사용된 상품에 대한 정보

    • User 테이블 : Order 테이블에서 상품 주문을 한 사용자에 대한 정보

📃 Redshift Spectrum 유즈 케이스

  • S3에 대용량 Fact 테이블이 파일들로 존재

  • Redshift에 소규모 Dimension 테이블이 존재

  • Fact테이블을 Redshift에 적재하지 않고 위의 두 테이블을 조인하고 싶다면

  • 이 때 사용할 수 있는 것이 Redshift Spectrum
    -> 별도의 설정이 필요하지 않은 확장 기능이나 사용한 만큼 비용 부담

📃 외부 테이블(External Table)이란?

  • 데이터 베이스 엔진이 외부에 저장된 데이터를 마치 내부 테이블처럼 사용하는 방법

    • 외부 : 보통 S3와 같은 클라우드 스토리지

    • External Table은 외부에 저장된 대량의 데이터를 데이터베이스 내부로 복사하고 쓰는 것이 아니라 임시 목적으로 사용하는 방식 ( 참조 )

  • SQL 명령어로 데이터베이스에 외부 테이블 생성 가능

    • 이 경우 데이터를 새로 만들거나 하는 것이 아니라 참조만 하게 됨

    • 외부 테이블은 CSV, JSON, XML과 같은 파일 형식 뿐만 아니라 ODBC 또는 JDBC 드라이버를 통해 액세스하는 원격 데이터베이스와 같은 다양한 데이터 소스에 대해서도 사용가능

  • 외부 테이블을 사용하여 데이터 처리 후 결과를 데이터베이스에 적재하는데 사용가능

  • 외부 테이블은 보안 및 성능 문제에 대한 신중한 고려가 필요

  • 이는 Hive 등에서 처음 시작한 개념으로 현재 대부분의 빅데이터 시스템에서 사용됨

📃 Redshift Spectrum 사용 방식

  • S3에 있는 파일들을 마치 테이블처럼 SQL로 처리 가능

  • Redshift 클러스터가 필요

  • S3 Fact 테이블을 외부 테이블(External Table)로 정의해야함

📃 Redshift Spectrum 외부 테이블 용 스키마 설정

  • Role에 AWSGlueConsoleFullAccess 권한 부여가 필요
    ( 전에 만들었던 redshift.read.s3에 권한을 추가 )

e.g.)

# CREATE EXTERNAL SCHEMA 명령어 사용

CREATE EXTERNAL SCHEMA external_schema
from data catalog # Glue Data Catalog
database 'myspectrum_db' # 외부 DB
iam_role 'arn:aws:iam::521227329883:role/redshift.read.s3'
create external database if not exists; # 외부 DB가 없으면 외부 DB를 생성

📃AWS Glue란?

AWS Glue는 AWS의 Serverless ETL 서비스
-> Airflow와 유사, 거의 AWS 내에서만 기능을 사용 가능

  • Data Catalog :

    AWS Glue Data Catalog는 데이터 소스 및 대상의 메타 데이터를 대상으로 검색 기능을 제공합니다.
    이는 주로 S3나 다른 AWS 서비스 상의 데이터 소스를 대상으로 합니다.
    (Redshift Spectrum의 경우에는 외부 테이블들)

  • AWS Glue Studio : ETL 작업 생성

    a. 간단한 드래그 앤 드롭 인터페이스를 통해 ETL 작업 생성을 가능하게 합니다.
    b. 사용자는 데이터 소스 및 대상을 선택하고 데이터 변환 단계를 정의하는 스크립트를 생성할 수 있습니다.

  • 작업 모니터링 및 로그

    • AWS Glue 콘솔을 통해 사용자는 ETL 작업의 실행 상태 및 로그를 모니터링 가능
  • 서버리스 실행

    • AWS Glue는 서버리스 아키텍쳐를 사용하므로 사용자는 작업을 실행하는데 필요한 인프라를 권리할 필요가 없습니다.
      ( Auto Scaling )

📃 Redshift Spectrum 외부 Fact 테이블 정의 예시

가정 : 전에 생성했던 S3 버킷에 usc라는 폴더를 만들고,
폴더에 user_session_channel.csv 파일을 복사했다고 가정

# CREATE EXTERNAL TABLE 명령어로 외부 테이블 정의

CREATE EXTERNAL TABLE external_schema.user_session_channel (
 userid integer ,
 sessionid varchar(32),
 channel varchar(32)
)
row format delimited # 한 줄이 한 record에 해당
fields terminated by ',' # csv파일을 ,를 기준으로 delimite한다는 것을 의미 
stored as textfile # 이 파일이 text형식으로 저장 되어 있음
location 's3://S3버킷이름/usc/'; # 파일의 위치로 전에 생성했던 버킷 내의 usc 폴더를 지정
# location으로 지정한 경로의 모든 파일을 테이블로 지정
# 이때, 하나의 format이라도 다르면 에러 발생

📃 Redshift Spectrum Fact + Dimension 테이블 예시

SELECT gender, COUNT(1)
FROM external_schema.user_session_channel usc # 외부 Fact
JOIN raw_data.user_property up ON usc.userid = up.userid # 내부 Dimension
GROUP BY 1;

🔎 Redshift ML 사용

📃 머신러닝의 정의

  • 배움이 가능한 기계(혹은 알고리즘)의 개발

    • 데이터의 패턴을 보고 흉내내는 방식으로 학습 (imitation)

    • 학습에 사용되는 이 데이터를 Training set이라고 부름

📃 머신러닝 모델이란?

  • 머신 러닝의 최종 산물이 머신 러닝 모델

    • 학습된 패턴(트레이닝 셋)에 따라 예측을 해주는 블랙박스

      • 블랙 박스인 이유 : 과정을 알 수 없기 때문

      • 선택한 머신러닝 학습 알고리즘에 따라 내부가 달라짐

      • 디버깅은 쉽지 않으며 왜 동작하는지 이유를 설명하기도 쉽지 않음

      • 트레이닝셋의 품질이 머신러닝 모델의 품질을 결정

  • 머신 러닝의 예측 방식

    • 지도 머신러닝 (Supervised Machine Learning)

      • Training set (X, Y)
      • X : 입력데이터 (feature)
      • Y : 예측값 (label)
        => 지도학습은 예측값(label)을 가지고 있는 것을 의미
    • 비지도 학습 (Unsupervised Machine Learning)

    • 강화 학습 (Reinforcement Learning)

  • 머신러닝 모델 트레이닝 혹은 빌딩이란?

    • 이런 머신 러닝 모델을 만드는 것을 지칭

📃 Amazon SageMaker란?

  • 머신러닝 모델 개발을 처음부터 끝까지 해결해주는 AWS 서비스

    • MLOps Framework
  • 크게 4가지 기능 제공

    • Training Set 준비
    • 모델 훈련
    • 모델 검증
    • 모델 배포와 관리
      • API 엔드포인트, 배치 서빙, ...
  • 다양한 머신러닝 Framework를 지원

    • Tensorflow/Keras, PyTorch, MXNet, ...
    • 자체 SageMaker 모듈로 머신러닝 모델 훈련 가능
  • SageMaker Studio라는 웹 기반 환경 제공 (Notebook)

  • 다양한 개발 방식 지원

    • 기본적으로 Python Notebook (SageMaker 모듈)을 통해 모델 훈련
      • 스칼라/자바 SDK도 제공
    • AutoPilot이라는 코딩 불필요 모델 훈련 기능 제공

-> 다른 클라우드 업체도 비슷한 Framework를 제공

📃 SageMaker의 AutoPilot

  • AutoPilot: SageMaker에서 제공되는 AutoML 기능

    • AutoML이란 모델빌딩을 위한 훈련용 데이터 셋을 제공하면 자동으로 모델을 만들어주는 기능
  • AutoPilot은 훈련용 데이터 셋을 입력하면 다음을 자동으로 수행

    1. 데이터 분석(EDA)를 수행하고 이를 Python Notebook으로 만들어줌

    2. 다수의 머신러닝 알고리즘과 하이퍼 파라미터의 조합에 대해 아래 작업을 수행

      머신러닝 모델을 만들고(modeling) 훈련하고(training) 테스트하고(test) 테스트 결과를 기록

    3. 선택 옵션에 따라 모텔 테스트까지 다 수행하기도 하지만 코드를 만드는 단계(Python Notebook)에서 마무리도 가능

      즉, AUtoPiloㅅ 기능을 통해 모델 개발 속도를 단축하는 것이 가능합니다.

  • 최종적으로 사용자가 모델을 선택 후 API로 만드는 것도 가능

    • 여기에 로그를 설정할 수 있음 (전체 로깅이나 샘플 로깅 설정 가능)

📃 SageMaker 실습 예제

  1. 캐글 Orange Telecom Customer Churn 데이터셋 사용 (csv)

    train.csv의 구성 ( Test: 20%, Train : 80% )

  2. 데이터 준비: csv 파일을 S3 버킷 아래 폴더로 업로드
    s3://버킷이름/redshift_ml/train.csv

  3. 위의 데이터를 raw_data.orange_telecom_customers로 로딩 (COPY)

    # Redshift에 table 생성
    CREATE TABLE raw_data.orange_telecom_customers (
     state varchar,
     account_length integer,
     area_code integer, 
     international_plan varchar,
     …
     customer_service_calls integer, 
     churn varchar,
     purpose varchar
    );
    # 만든 Table에 COPY로 csv 파일의 내용을 복사
    COPY raw_data.orange_telecom_customers
    FROM 's3://버킷이름/redshift_ml/train.csv'
    credentials 'aws_iam_role=arn:aws:iam::521227329883:role/redshift.read.s3'
    delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 
    removequotes;
  4. SageMaker 사용권한을 Redshift cluster에 지정
    ( AmazonSageMakerFullAccess )

  5. CREATE MODEL 명령을 사용

    a. 모델을 생성하고 모델 사용시 호출할 SQL 함수도 생성
    b. 이때, SageMaker와 관련한 비용이 발생하므로 유의

    # Train을 대상으로 모델 생성
    CREATE MODEL orange_telecom_customers_model 
    FROM (
     SELECT
     state, account_length,, customer_service_calls, churn
     FROM raw_data.orange_telecom_customers
     WHERE purpose = 'Train'
    )
    TARGET churn # 모델을 만들 때 예측해야하는 컬럼으로 churn을 지정 
    FUNCTION ml_fn_orange_telecom_customers # 나중에 호출할 수 있도록 SQL 함수로 이름을 이렇게 지정
    IAM_ROLE 'arn:aws:iam::521227329883:role/Redshift-ML'
    SETTINGS (
     S3_BUCKET '버킷 이름'
    );
    # 모델이 잘 준비되었는지 확인
    SHOW MODEL orange_telecom_customers_model;
  6. Model SQL 함수를 사용해서 테이블의 Test 레코드들을 대상으로 예측 수행

    # 예측 대상 : churn
    SELECT churn,
     ml_fn_orange_telecom_customers(
     state, account_length, area_code, international_plan, voice_mail_plan, 
     number_vmail_messages, total_day_minutes, total_day_calls, 
     total_day_charge, total_eve_minutes, total_eve_calls, total_eve_charge, 
     total_night_minutes, total_night_calls, total_night_charge, 
     total_intl_minutes, total_intl_calls, total_intl_charge, 
     customer_service_calls
     ) AS "prediction" # 함수의 결과는 prediction
    FROM raw_data.orange_telecom_customers
    WHERE purpose = 'Test';
  7. 사용이 다 끝난 후 SageMaker와 관련한 리소스 제거

    • Drop Model 실행
    • SageMaker 서비스 웹 콘솔리 이동 후에 혹시라도 남은 잔재가 있는지 확인해야합니다.

🔎 Redshift 중지/제거

중지는 Redshift가 고정 비용 옵션인 경우에만 해당되는 옵션입니다. 가변 비용 옵션(Severless)인 경우에는 중지 기능이 없습니다.

📃 Redshift 관련 유지보수

  • Redshift 서비스는 주기적으로 버전 업그레이드를 위해 중단됨
    • 이를 Maintenance window라 부릅니다.
    • Serverless에는 존재하지 않음

Maintenance window가 Redshift 쪽에서 사용중이던 클러스터를 강제로 Restart를 시키는 경우가 있습니다.

이로 인해 가끔 에러가 발생하기에, Maintenance window가 동작하는 시간대를 콘솔에서 확인했다가 정말 중요한 작업은 그 시간대를 피해야합니다.
( Serverless에는 Maintenance window가 없습니다. )

📃 테이블 청소와 최적화 - VACUUM 명령

  • 테이블 데이터 정렬
  • 디스크 공간 해제
  • 삭제된 행에서 공간 회수
  • 테이블 통계 업데이트
  • 큰 테이블에 대한 VACUUM 명령은 리소스를 많이 소모

VACUUM을 주기적으로 사용해준다면 DB 테이블의 삭제, 업데이트를 빈번하게 사용했을 경우 발생하는 문제를 방지할 수 있습니다.

📃 (고정 비용) Redshift 클러스터 중지/재실행

  • Redshift가 당분간 필요 없는 경우

    Pause를 선택,
    이 경우 스토리지 비용만 부담, SQL은 실행 불가능

  • Redshift가 다시 필요해진 경우

    • 동일 메뉴에서 Resume을 선택
  • Redshift가 영원히 필요없는 경우

    • 동일 메뉴에서 Delete을 선택
    • 이때, 데이터베이스 내용 백업을 S3로 할지 여부를 선택
    • 이 S3 백업으로부터 나중에 새로운 론치 가능

📃 (가변 비용) Redshift Serverless 삭제

  1. 먼저 모든 Workgroup들을 삭제
  2. 다음으로 모든 Namespace들을 삭제
profile
데이터 엔지니어를 꿈꾸는 거북이, 한걸음 한걸음

0개의 댓글