데브코스 TIL/AWS 클라우드

Redshift 소개

예니ㅣ 2023. 11. 28. 12:30

강의

Redshift

Redshift 특징

  • 최소 160GB부터 최대 2PB 용량 처리 가능
  • OLAP : 응답속도 느림 → 프로덕션 데이터베이스 사용 불가
  • 컬럼 기반 스토리지 : 컬럼별 압축 가능 및 컬럼 추가/삭제 용이
  • 벌크 업데이트 지원 : S3로 파일 복사 → COPY로 Redshift에 일괄 복사
  • 고정 용량/비용 옵션 및 가변 비용 옵션 제공
  • 데이터 공유(Datashare) 가능
  • Primary key 유일성 보장 불가
  • Postgresql 8.x 및 SQL 호환

 

Redshift 스케일링 방식

"Resizing"은 용량이 부족해질 때마다 새로운 노드를 추가하는 스케일링 방식입니다.

Auto Scaling 옵션으로 설정하여 자동 실행할 수 있습니다.

Redshift의 가변비용 옵션으로 Redshift Serverless를 사용하여 Snowflake, BigQuery의 방식을 사용할 수 있습니다.

  • Scale Out : 용량이 부족하면 장치 추가
  • Scale Up : 용량이 부족하면 사양 업그레이드

 

Redshift 레코드 분배 및 저장 방식

Redshift는 최적화가 매우 복잡합니다.

다수의 노드로 구성된 Redshift는 레코드를 분산 저장해야 합니다.

  • Diststyle : 레코드 분배 방법
    • all
    • even(default)
    • key
  • Distkey : Diststyle이 key인 경우, 기준 컬럼 설정
  • Sortkey : 정렬 기준 컬럼 설정
    • 타임스탬프 필드(default)
CREAT TABLE table_name(
	column1 INT,
    column2 TIMESTAMP,
    ...
) DISTSTYLE KEY DISTKEY(column1) SORTKEY(column2)
;

 

Redshift 데이터 타입

  • 기본
    • SMALLINT (INT2)
    • INTEGER (INT, INT4)
    • BIGINT (INT8)
    • DECIMAL (NUMERIC)
    • REAL (FLOAT4)
    • DOUBLE RECISION (FLOAT8)
    • BOOLEAN (BOOL)
    • CHAR (CHARACTER)
    • VARCHAR (CHARACTER VARYING)
    • TEXT (VARCHAR(256))
    • DATE
    • TIMESTAMP
  • 고급
    • GEOMETRY
    • GEOGRAPHY
    • HLLSKETCH
    • SUPER

 


Redshift 설치

Redshift 대시보드
퍼블릭 액세스 가능 설정
Workspace 인바운드 규칙 추가

 

COLAP에서 실행하기

%load_ext sql

!pip install ipython-sql==0.4.1

!pip install SQLAlchemy==1.4.49

%sql postgresql://admin:***@default-workgroup.986431558097.us-west-2.redshift-serverless.amazonaws.com:5439/dev

 


Redshift 초기 설정

Schema

"Schema"는 카테고리별 테이블 관리를 위한 폴더 입니다.

  • raw_data : ETL 결과
  • analytics : ELT 결과
  • adhoc : 테스트용 테이블
  • pii : 개인정보
# 사용자 생성하기
CREATE USER yen PASSWORD ***;

# 사용자 리스트
SELECT * FROM pg_user;

# 스키마 생성하기
CREATE SCHEMA raw_data;
CREATE SCHEMA analytics;
CREATE SCHEMA adhoc;
CREATE SCHEMA pii;

# 스키마 리스트
SELECT * FROM pg_namespace;

 

그룹(Group)

"그룹"은 계승이 불가능하기 때문에 사용자 그룹별로 액세스 권한을 설정하는 것이 좋습니다.

  • analytics_users : 데이터 활용 개인
  • analytics_authors : 데이터 분석가
  • pii_users : 어드민
# 그룹 생성하기
CREATE GROUP analytics_users;
CREATE GROUP analytics_authors;
CREATE GROUP pii_users;

# 그룹에 사용자 추가하기
ALTER GROUP analytics_users ADD USER yen;
ALTER GROUP analytics_authors ADD USER yen;
ALTER GROUP pii_users ADD USER yen;

# 그룹 리스트
SELECT * FROM pg_group;

 

역할(Role)

"역할"은 계승이 가능하고 한 사용자가 다수의 역할에 소속될 수 있습니다.

# 역할 생성하기
CREATE ROLE staff;
CREATE ROLE manager;
CREATE ROLE external;

# 역할 부여하기
GRANT ROLE staff TO yen;
GRANT ROLE staff TO ROLE manager;

# 역할 리스트
SELECT * FROM SVV_ROLES;

 


벌크 업데이트

벌크 업데이트는 Redshift에서 기본적으로 사용하는 레코드 업데이트 방식 입니다.

Snowflake, BigQuery에서도 사용할 수 있습니다.

 

Redshift 벌크 업데이트

  1. S3에 CSV 파일 복사 : S3 웹콘솔
  2. raw_data 스키마 밑에 CREATE TABLE 이용하여 테이블 생성
  3. S3 접근 권한 가능한 역할 생성 : IAM 웹콘솔
  4. Redshift 클러스터에 역할 저장 : Redshift 웹콘솔
# 에러 확인하기
SELECT * FROM stl_load_errors ORDER BY starttime DESC;
SELECT * FROM sys_load_error_detail;
# 테이블 생성
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
);
# CSV 파일을 테이블로 복사하기
COPY raw_data.user_session_channel
FROM 's3://yeeen-test-bucket/test_data/user_session_channel.csv'
credentials 'aws_iam_role=arn:aws:iam::986431558097:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

COPY raw_data.session_timestamp
FROM 's3://yeeen-test-bucket/test_data/session_timestamp.csv'
credentials 'aws_iam_role=arn:aws:iam::986431558097:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

COPY raw_data.session_transaction
FROM 's3://yeeen-test-bucket/test_data/session_transaction.csv'
credentials 'aws_iam_role=arn:aws:iam::986431558097:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
# analytics 스키마에 테이블 생성하기(ELT)
CREATE TABLE analytics.mau_summary AS
SELECT 
  TO_CHAR(TS.ts, 'YYYY-MM') AS month,
  COUNT(DISTINCT MAIN.userid) AS mau
FROM raw_data.session_timestamp AS TS
JOIN raw_data.user_session_channel AS MAIN
  ON TS.sessionid = MAIN.sessionid
GROUP BY 1
ORDER BY 1 DESC
;

 

 

'데브코스 TIL > AWS 클라우드' 카테고리의 다른 글

AWS Glue  (1) 2023.11.29
Redshift 고급 기능  (1) 2023.11.29
AWS Part 13 Devops  (0) 2023.11.24
AWS Part 12 CloudWatch  (0) 2023.11.24
AWS Part 11 Serverless  (0) 2023.11.24