AWS
에서 지원하는 데이터 웨어하우스 서비스Still OLAP
: 응답 속도가 빠르지 않기 때문에 프로덕션 데이터베이스로 사용하면 장애가 발생할 수 있음.Redshift Serverless
는 가변 비용 옵션도 제공하고 있음.Primary Key Uniqueness
를 보장하지 않는다.Postgresql 8.X
와 SQL이 호환되기 때문에 지원하는 툴이나 라이브러리로 액세스 가능하다.✍ [AWS RedShift] 1. AWS RedShift 개념
일전에 강의를 듣고, 추가적으로 공부해서 작성했던 Redshift의 개념에 대해 Redshift 실습에 앞서 다시 정리하는 느낌이었다.
Snowflake
과 BigQuery
와는 방식이 다르다. 왜냐하면 둘은 가변 비용 옵션이기 때문에 특별하게 용량이 정해져 있지 않고 쿼리를 처리하기 위해 사용한 리소스에 해당하는 비용을 지불하면 된다. 훨씬 더 스케일링한 데이터베이스 기술이지만 비용 예측이 불가능하다라는 단점이 존재한다.Redshift
가 두 대 이상의 노드로 구성되면 한 테이블의 레코드들을 저장하기 위해서는, 데이터 스큐(Data skew)
가 발생한다.Snowflake
와 BigQuery
는 이를 개발자가 관리할 필요 없고 자체에서 알아서 처리해 준다.Diststyle
all
: 모든 레코드들이 모든 노드에 분배 (가장 많이 사용됨) even
: 노드별로 돌아가면서 레코드를 하나씩 분배 (default 값)key
: 특정 컬럼의 값을 기준으로 레코드들이 다수의 노드로 분배 (보통 primary key처럼 고유한 컬럼을 사용) -> 이때 사용되는 것이 Distkey
Distkey
Sortkey
-- 다음과 같은 Query를 작성할 수 있음
-- 이 경우 key 형식으로 col1을 기준으로 레코드들이 분배되고
-- 같은 노드 내에서는 col3를 기준으로 정렬된다는 뜻
CREATE TABLE my_table(
col1 INT,
col2 VARCHAR(50),
col3 TIMESTAMP,
col4 DECIMAL(18, 2)
) DISTSTYLE KEY DISTKEY(col1) SORTKEY(col3);
⚡ Diststyle이 key인데 컬럼 선택이 잘못된다면?
Diststyle
이 key라는 건 특정 key의 값이 같은 레코드들은 같은 노드에 들어가게 되는 것이다.Group by
를 하거나Join
을 하면 데이터의 이동이 별로 없어서 좋다는 장점이 있다.- 그런데 만약 그 key의 컬럼에
스큐(skew)
가 있다면? 그래서 특정 key를 갖는 레코드가 많아진다면?
- 노드 1에는 많은 데이터가 들어가고 노드 2에는 작은 데이터가 들어가는 불균형이 생기게 된다.
- 이는 특정 테이블을 처리할 때는 더 많은 시간이 걸리고 다른 테이블을 처리할 때는 빨리 처리되는 등 이후 데이터 처리에 문제가 발생한다.
- 그렇기 때문에 레코드 분배에
스큐(skew)
가 발생했는지 확인을 해 주어야 한다.
Redshift
에서 벌크 업데이트를 하는 방식은 COPY SQL
이다. 이 방법은 Redshift
의 고유한 방법은 아니고 모든 데이터 웨어하우스에서 제공하는 방식이다.📌 벌크 업데이트 순서
Binary file
로 만든 다음 이를 클라우드 스토리지에 로딩한다. (Redshift라면 S3)COPY SQL
을 통해 한 번에 Redshift
의 원하는 테이블로 업데이트한다.📌 PostgreSQL과 크게 다르지 않지만 CHAR 단위가 Redshift
에서는 바이트 단위가 된다는 차이점이 존재한다. (이 부분을 유의해야 함.)
💻 [AWS RedShift] 4. AWS RedShift Serverless 생성
실습이라 따로 포스팅 해 두었습니다.
CREATE SCHEMA
쿼리문을 통해 각각의 스키마를 생성해 준다.CREATE SCHEMA RAW_DATA;
CREATE SCHEMA ALALYTICS;
CREATE SCHEMA ADHOC;
CREATE SCHEMA PII;
SELECT
문과 PG_NAMESPACE
를 통해 조회할 수 있다.SELECT *
FROM PG_NAMESPACE;
PASSWORD
뒤에 설정해 줄 비밀번호를 입력해 주면 된다.CREATE USER
를 통해 사용자를 생성해 줄 수 있다.CREATE USER song PASSWORD '...';
SELECT
문과 PG_USER
를 통해 조회할 수 있다.SELECT *
FROM PG_USER;
analytics_users
analytics_authors
pii_users
역할(Role)
이다. 역할은 계승이 가능하다.CREATE GROUP
구문을 통해 그룹을 생성할 수 있다.CREATE GROUP analytics_users;
CREATE GROUP analytics_authors;
CREATE GROUP pii_users;
ALTER GROUP groupname ADD USER username
을 사용해 준다. 이후 GRANT
쿼리문을 통해 각각 권한을 부여해 줄 수 있는데 이 단계는 뒤에서 나올 예정이다.ALTER GROUP analytics_users ADD USER song;
ALTER GROUP analytics_authors ADD USER song;
ALTER GROUP pii_users ADD USER song;
SELECT
와 PG_GROUP
을 통해 볼 수 있다.SELECT *
FROM PG_GROUP;
CREATE ROLE staff;
CREATE ROLE manager;
CREATE ROLE external;
GRANT ROLE rolename TO username
, GRANT ROLE rolename TO ROLE otherrolename
으로 쿼리문을 사용해 주면 된다. -- staff 역할을 song이라는 사용자에게 부여한다.
GRANT ROLE staff TO song;
-- staff 역할을 manager 역할에게 부여한다
GRANT ROLE staff TO ROLE manager;
SELECT
와 SVV_ROLES
로 확인할 수 있다.SELECT *
FROM SVV_ROLES;
💻 [AWS RedShift] 5. SQL로 Redshift 초기 설정 - 실습 포스팅
COPY
명령을 통해 raw_data
스키마 밑 3 개의 테이블에 레코드를 적재raw_data
의 목적은 ETL을 통해 외부에서 읽어온 데이터를 저장한 스키마이다.CREATE TABLE
을 통해 생성해 준다.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
);
COPY SQL
을 통해 데이터를 적재해 주기 위해서는 csv를 S3에 업로드 해 주는 과정이 필요하다.AWS
콘솔에서 S3 bucket
을 생성해 주어야 한다. bucket
에 csv 파일을 담을 폴더를 생성해 주고 1에서 생성한 테이블에 상응하는 csv 파일들을 해당 폴더에 업로드 해 준다.COPY
가 불가능하다. 그래서 먼저 권한을 부여해 준다. IAM (Identity and Access Management)
을 통해 생성해 주어야 한다.IAM Role
만들기IAM
웹 콘솔 방문Roles
선택Create Role
선택 후 AWS Service
를 선택한 후 Common use cases
에서 Redshift-Customizable
를 선택해 준다. (해당 역할을 Redshift에 주고 싶은 권한이라는 뜻)AmazonS3FullAccess
를 선택해 준다. (S3에 접근할 수 있는 권한을 부여할 것이기 때문에)redshift.read.s3
로 설정.보안 및 암호화(Security and Encryption
탭 아래 Manage IAM roles
라는 버튼을 선택해 준다.Associate IAM roles
에서 앞서 만든 redshift.read.s3
역할을 지정해 준다.벌크 업데이트
를 수행해 테이블에 적재하는 과정이다.COPY SQL
사용한다.removequotes
를 지정해 준다.IGNOREHEADER 1
을 지정해 준다.CREDENTIALS
에 앞서 Redshift
에서 지정한 역할(Role)
을 사용해 주는데 이때 역할의 ARN
을 읽어와야 함.COPY raw_data.user_session_channel
FROM 's3://s3의 csv 위치`
CREDENTIALS 'aws_iam_role=arn:aws:iam:xxxxxx:role/redshift.read.s3'
DELIMITER ','
DATEFORMAT 'auto'
TIMEFORMAT 'auto'
IGNOREHEADER 1
REMOVEQUOTES;
SQL
구문을 세 개의 csv 파일과 세 개의 테이블에 진행해 주어야 함.binary file format
을 쓴다.SELECT *
FROM STL_LOAD_ERRORS
ORDER BY STARTTIME DESC;
💻 [AWS RedShift] 6. 벌크 업데이트 (Bulk Update) 구현 - 실습 포스팅
raw_data
에 있는 테이블을 조인해서 필요한 정보들을 가지고 새로운 테스트 테이블을 analytics
스키마에 만들어 보자.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;
1. 데이터 스큐 (Data Skew)
스큐(skew)
는 직역으로 해석하면 비뚤어진, 비스듬한이라는 뜻이다.- 그렇다면
데이터 스큐 (Data Skew)
는 비스듬한, 비뚤어진 데이터를 말한다.- 예를 들어 어떤 테이블의 데이터를 세 개의 노드로 나눠 저장한다고 할 때 분배가 잘못되면 한 테이블에 많은 데이터가 들어가고 다른 테이블에는 소수의 데이터만 들어가게 된다면 분산 저장하는 이유가 없어진다.
- 이렇게 한쪽에만 많은 데이터가 쌓이는 경우, 데이터의 비대칭이 일어나는 경우를
스큐(skew)
라고 한다.
2. removequotes
- 입력 데이터의 문자열에서 묶고 있는 인용 부호를 제거하고, 인용 부호 안의 문자는 구분자를 포함해 모두 유지하도록 하는 SQL 구문
- 예를 들어 "흰색"이라는 문자열이 있다면 removequotes를 사용하면 큰 따옴표를 제외하고 흰색이 반환된다.
- 다만 문자열에 선행하는 작은 따옴표나 큰 따옴표만 있고 후행하는 인용 부호가 없을 때는 오류가 발생한다.
- 예를 들어 "파란색에 대해 removequotes를 사용하면 오류가 발생한다.
- 하지만 파란색"에 대해서는 removequotes를 사용해도 오류는 발생하지 않고, 파란색"이라고 그대로 나오게 된다.
- 즉, 선행되는 작은 따옴표나 큰 따옴표가 없고 후행하는 인용 부호만 있을 경우는 오류가 나진 않지만 인용 부호 역시 제거되지 않는다.
3. ARN
Amazon 리소스 이름
을 말하며AWS 리소스
의 고유 식별자이다.- 대개
IAM 정책
,RDS 태그 및 API 호출
과 같은AWS 리소스
를 명료하게 지정해야 하는 경우에 사용한다.- ARN의 형식
arn:partition:service:region:account-id:resource-type:resource-id
arn:partition:service:region:account-id:resource-type/resource-id
arn:partition:service:region:account-id:resource-id