일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- spark
- docker hub
- yarn
- Django
- 알고리즘
- docker
- Serializer
- 웹 크롤링
- 데이터레이크
- airflow.cfg
- truncate
- 컨테이너 삭제
- AWS
- redshift
- docker-compose
- snowflake
- 웹 스크래핑
- 데이터 웨어하우스
- SQL
- ETL
- Kafka
- ELT
- Django Rest Framework(DRF)
- dag
- dag 작성
- 데이터마트
- 데이터파이프라인
- airflow
- Hive
- selenium
Archives
- Today
- Total
개발 기록장
02. Redshift 소개와 기능 본문
반응형
학습 주제: 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이 메인 언어
- 데이터 모델링(테이블 디자인) 매우 중요
- Postgresql 8.x와 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에서는 이런 속성을 개발자가 지정할 필요 없음(시스템이 자동으로 선택)
- Diststyle이 key인 경우 컬럼 선택이 잘못된다면?
- 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의 데이터 타입
기본 데이터 타입
- 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
- 다른 기타 관계형 데이터베이스와 동일한 구조
스키마(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도 함께 다뤄 볼 수 있어 좋았다.
반응형
'데브코스(DE) > 데이터 웨어하우스 관리와 고급 SQL, BI 대시보드' 카테고리의 다른 글
05. 대시보드 소개와 구현 (0) | 2024.05.12 |
---|---|
04. Snowflake 운영과 관리 (0) | 2024.05.12 |
03. Redshift 고급 기능 실습(권한과 보안/백업 등) (0) | 2024.05.08 |
01. 다양한 데이터 웨어하우스 옵션, ETL/ELT, 데이터 조직 (0) | 2024.05.07 |