개발 기록장

02. Redshift 소개와 기능 본문

데브코스(DE)/데이터 웨어하우스 관리와 고급 SQL, BI 대시보드

02. Redshift 소개와 기능

jxwxnk 2024. 5. 7. 23:43
반응형

학습 주제: Redshift 특징, 설치 및 초기 설정, S3, IAM, Redshift COPY

Redshift

Redshift의 특징

  • AWS에서 지원하는 데이터 웨어하우스 서비스
  • 2PB의 데이터까지 처리 가능
    • 최소 160GB로 시작해서 점진적으로 용량 증감 가능
  • OLAP(OnLine Analytical Processing): 대규모 데이터 처리에 적합
    • 응답속도가 빠르지 않으므로 프로덕션 데이터베이스로는 사용불가
  • 컬럼 기반 스토리지
    • 레코드 별로 저장하는 것이 아니라 컬렴별로 저장
    • 컬럼별 압축이 가능하며 컬럼의 추가/삭제가 매우 빠름
  • 벌크 업데이트 지원
    • 레코드가 들어있는 파일을 S3로 복사 후 COPY 커맨드로 Redshift로 일괄 복사
  • 고정 용량/비용 SQL 엔진
    • 최근에는 가변 비용 옵션도 제공(Redshift Severless)
  • 데이터 공유 기능(DataShare)
    • 다른 AWS 계정과 특정 데이터 공유 가능(Snowflake 기능 따라함)
  • 다른 데이터 웨어하우스와 같이 primary key uniqueness 보장 X
    • 프로덕션 데이터베이스들은 보장 O
  • Redshift는 SQL 기반 관계형 데이터베이스
    • Postgresql 8.x와 SQL이 호환됨
      • Postgresql 8.x의 모든 기능을 지원하는 것 X
      • ex) text 타입 존재 X
    • Postgresql 8.x를 지원하는 툴이나 라이브러리로 액세스 가능
      • JDBC/ODBC
    • SQL이 메인 언어
      • 데이터 모델링(테이블 디자인) 매우 중요

Redshift의 스케일링 방식

  • 용량이 부족해질 때마다 새로운 노드를 추가하는 방식으로 스케일링
  • 시스템 크기를 조정하는 작업: Resizing. Auto Scailing 옵션을 설정하면 자동으로 이루어짐
    • Scale Out 방식: 성능 및 용량을 늘리기 위해 여러 작은 서버나 노드를 추가하는 방식, 시스템을 더 많은 작은 단위로 확장
    • Scale Up 방식: 성능 및 용량을 늘리기 위해 단일 서버나 노드의 리소스를 증가시키는 방식(사양 업그레이드), 단일 단위를 더 크게 확장
  • Snowflake와 BigQuery의 방식과는 다름
    • Snowflake와 BigQuery는 가변비용 서비스로 훨씬 확장성이 높은 데이터베이스 기술
    • But, 비용의 예측이 불가능하다는 단점 존재함
  • Redshift에도 가변 비용 옵션 존재(Redshift Serverless)

Redshift의 레코드 분배와 저장방식(최적화)

  • Redshift가 두 대 이상의 노드로 구성되면 테이블 최적화가 중요해 짐
    • 개발자가 직접 노드구조(레코드를 어떻게 노드에 분산 저장할지)를 지정해줘야 하므로 최적화 과정이 복잡함
    • 한 테이블의 레코드들을 어떻게 다수의 노드로 분배할 것인가
  • Distkey(Distribution key): Redshift 테이블을 분산하는 데 사용되는 기준 열(column)을 나타냄
    • 해당 열의 값에 따라 데이터를 여러 노드에 분산시킴
  • Diststyle(Distribution style): Redshift 테이블을 분산하는 방법
    • all: 테이블의 모든 행을 모든 노드에 복제(;모든 레코드들이 모든 노드에 복제)
    • even: 모든 행을 균등하게 분산(;Round Robin 형태로 레코드 분배), 대용량 테이블에 유용
    • key: 특정 컬럼 값을 기준으로 레코드가 다수의 노드로 분배(Distkey를 기반으로 데이터 분산), 보통 table의 primary key)
      • Diststyle이 key인 경우 컬럼 선택이 잘못된다면?
        • 레코드 분포에 Skew 발생하여 분산 처리의 효율이 사라짐
        • BigQuery/Snowflake에서는 이런 속성을 개발자가 지정할 필요 없음(시스템이 자동으로 선택)
  • Sortkey(Sorting key): Redshift 테이블에 데이터를 저장할 때 사용되는 정렬 키(정렬될 기준 컬럼), 보통 timestamp 필드 이용
CREATE TABLE my_table(
    column1 INT,
    column2 VARCHAR(50),
    column3 TIMESTAMP,
    column4 DECIMAL(18,2)
)DISTSTYLE KEY DISTKEY(column1) SORTKEY(column3);

Redshift의 벌크 업데이트 방식 - COPY SQL

1. 소스로부터 데이터 추출
2. S3에 업로드(보통 Parquet 포맷 선호)
3. COPY SQL로 S3에서 Redshift 테이블로 한번에 복사

Redshift의 벌크 업데이트 방식- COPY SQL

Redshift의 데이터 타입

기본 데이터 타입

  • SMALLINT (INT2)
  • INTEGER (INT, INT4)
  • BIGINT (INT8)
  • DECIMAL (NUMERIC)
  • REAL (FLOAT4)
  • DOUBLE PRECISION (FLOAT8)
  • BOOLEAN (BOOL)
  • CHAR (CHARACTER)
  • VARCHAR (CHARACTER VARYING)
  • DATE
  • TIMESTAMP

고급 데이터 타입

  • GEOMETRY
  • GEOGRAPHY
  • HLLSKETCH
  • SUPER

Redshift 초기 설정

Redshift Schema

  • 다른 기타 관계형 데이터베이스와 동일한 구조

Redshift Schema 구조

스키마(Schema) 설정

  • 모든 스키마 리스트하기: SELECT * FROM pg_namespace;
CREATE SCHEMA raw_data;
CREATE SCHEMA analytics;
CREATE SCHEMA adhoc;
CREATE SCHEMA pii;

사용자(User) 생성

  • 모든 사용자 리스트하기: SELECT * FROM pg_user;
CREATE USER jiwon PASSWORD '****비밀번호****';

그룹(GROUP) 생성/설정

  • 한 사용자는 다수의 그룹에 속할 수 있음
  • 그룹(GROUP)은 계승(상속)이 안됨
    • 많은 그룹을 만들게 되고 관리가 어려워 짐
  • 예를 들어 다음과 같은 그룹이 존재한다면
    • 어드민을 위한 pii_users
    • 데이터 분석가를 위한 analytics_authors
    • 데이터를 활용하는 개인을 위한 analytics_users
      analytics_authors가 analytics_users에 속하더라도 계승X 이므로 따로 만들어야 함
      pii_users가 analytics_authors에 속하더라도 계승X 이므로 따로 만들어야

그룹 구조 예시

  • 그룹 생성: CREATE GROUP
  • 그룹에 사용자 추가: ALTER GROUP 그룹이름 ADD USER 사용자이름
  • 그룹에 스키마/테이블 접근 권한 설정
  • 모든 그룹 리스트하기: SELECT FROM pg_group;
CREATE GROUP analytics_users;
CREATA GROUP analytics_authors;
CREATE GROUP pii_users;
ALTER GROUP analytics_authors ADD USER jiwon;
ALTER GROUP analytics_users ADD USER jiwon;
ALTER GROUP pii_users ADD USER jiwon;

역할(Role) 생성/설정

  • 역할은 그룹과 달리 계승(상속) 구조를 만들 수 있음
  • 역할은 사용자 또는 다른 역할에 부여 가능
  • 한 사용자는 다수의 역할에 소속 가능
  • 모든 역할 리스트하기: SELECT * FROM SVV_ROLES;
CREATE ROLE staff;
CREATE ROLE manager;
CREATE ROLE external;
GRANT ROLE staff TO jiwon; --jiwon 대신 다른 역할(Role) 지정 가능
GRANT ROLE staff TO ROLE manager;

Redshift COPY 명령을 통해 테이블에 레코드 적재

1. 각 테이블을 CREATE TABLE 명령으로 raw_data 스키마 밑에 생성
2. 각 테이블의 입력인 CSV 파일을 S3에 업로드
* S3 버킷 생성
3. S3에서 Redshift의 테이블로 복사
* AWS IAM: Redshift가 S3에 접근할 수 있는 권한 생성
* Redshift COPY 명령 실행

테이블 생성: raw_data 테이블 만들기

  • raw_data 스키마 아래 3개의 테이블 생성
    • 보통 이런 테이블들은 ETL을 통해 데이터 소스에서 복사해오는 형태로 이루어짐
CREATE TABLE raw_data.user_session_channel(
  userid integer,
  sessionid varchar(32) primary key,
  channel varchar(32)
);
CREATE TABLE raw_data.session_timestamp(
  sessionid varchar(32) primary key,
  ts timestamp
);
CREATE TABLE raw_data.session_transaction(
  sessionid varchar(32) primary key,
  refunded boolean,
  amount int
);

S3 버킷 생성과 파일 업로드

  • AWS S3에서 버킷(&&폴더) 생성하고 CSV 파일 업로드
    • S3://jiwon-test-bucket/test_data/user_session_channel.csv
    • S3://jiwon-test-bucket/test_data/session_timestamp.csv
    • S3://jiwon-test-bucket/test_data/session_transaction.csv

IAM: Redshift에 S3 접근 권한 설정

  • Redshift가 S3 버킷에 대해 접근할 수 있어야 함
  • AWS IAM(Identity and Access Management)을 이용해 역할(Role) 생성 및 부여
    • Role name: redshift.read.s3
    • Filter policies: AmazonS3FullAccess
  • Redshift 클러스터에서 'redshift.read.s3' 지정

COPY 명령을 통해 CSV 파일-> 테이블로 복사

  • CSV 파일이므로 delimiter로는 콤마(,) 지정
  • removequotes 지정: CSV 파일에서 문자열이 따옴표로 둘러싸인 경우 제거
  • IGNOREHEADER 1: CSV 파일의 첫번째 라인(헤더)를 무시하기 위해 지정
  • credentials: Redshift에 지정한 Role의 ARN 지정
COPY raw_data.user_session_channel
FROM 's3://jiwon-test-bucket/test_data/user_session_channel.csv'
credentials 'aws_iam_role=arn:aws:iam::xxxxxxx:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
COPY raw_data.user_session_channel
FROM 's3://jiwon-test-bucket/test_data/session_timestamp.csv'
credentials 'aws_iam_role=arn:aws:iam::xxxxxxx:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
COPY raw_data.user_session_channel
FROM 's3://jiwon-test-bucket/test_data/session_transaction.csv'
credentials 'aws_iam_role=arn:aws:iam::xxxxxxx:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

Redshift에 복사한 테이블 확인

정상 작동 결과 확인

SELECT * FROM raw_data.user_session_channel LIMIT 10;
SELECT * FROM raw_data.session_timestamp LIMIT 10;
SELECT * FROM raw_data.session_transaction LIMIT 10;

실행중 에러 발생

  • COPY 명령 실행 중 에러 발생하면 stl_load_errors 테이블 내용 확인
    SELECT * FROM stl_load_errors ORDER BY starttime DESC; 

analytics 테스트 테이블 만들기

  • raw_data에 있는 테이블 조인해서 새로 만들기 (ELT)
  • 간단하게는 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.user_session_channel B ON A.sessionid = B.sessionid
    GROUP BY 1
    ORDER BY 1 DESC;

공부하며 느낀점

Redshift 실습을 통해 GROUP, ROLE, 테이블 복제의 개념을 확실히 익힐 수 있었다. 또 S3, IAM도 함께 다뤄 볼 수 있어 좋았다.

반응형