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처럼 고유한 컬럼을 사용) -> 이때 사용되는 것이 DistkeyDistkey
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-idarn:partition:service:region:account-id:resource-type/resource-idarn:partition:service:region:account-id:resource-id