일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹크롤링
- 데이터웨어하우스
- DataWarehouse
- 데이터베이스
- 에어플로우
- Service
- 파이썬
- SQL
- 부트캠프
- 자료구조
- 데브코스
- airflow
- 관계형데이터베이스
- 데이터엔지니어링
- 개념정리
- 클라우드
- 프로그래머스
- 웹스크래핑
- AWS
- 취준
- 운영체제
- WEB
- 기술면접
- 웹자동화
- Amazon
- Django
- CS
- 알고리즘
- 개발
- 데이터엔지니어
- Today
- Total
사진과 음악을 좋아하는 개발자 지망생의 블로그
[데이터 웨어하우스 - 중급] 2. Redshift - ① Redshift 개요 본문
1. Redshift 특징
Redshift는 AWS에서 제공하는 데이터 웨어하우스 서비스로, 대용량 데이터 처리를 위한 특징을 가지고 있습니다. 몇 가지 주요 특징은 다음과 같습니다
- 대용량 데이터 처리: Redshift는 최대 2 PB의 데이터까지 처리할 수 있습니다. 처음에는 최소 160GB부터 시작하여 필요에 따라 용량을 점진적으로 증가시킬 수 있습니다.
- OLAP(Online Analytical Processing): Redshift는 응답 속도가 매우 빠르지는 않기 때문에 프로덕션 데이터베이스로는 적합하지 않습니다.
- 컬럼 기반 스토리지: Redshift는 데이터를 컬럼 기반으로 저장합니다. 이는 레코드 단위로 저장하는 것이 아니라 각 컬럼을 개별적으로 저장함을 의미합니다. 이러한 구조는 데이터 압축에 효과적이며, 컬럼을 추가하거나 삭제하는 작업도 매우 빠릅니다. 이는 쿼리 성능을 향상시키는 데 도움이 됩니다.
- 벌크 업데이트 지원: Redshift는 벌크 업데이트를 지원합니다. 이는 레코드가 포함된 파일을 Amazon S3로 복사한 후 COPY 커맨드를 사용하여 Redshift로 대량 복사할 수 있다는 것을 의미합니다. 이를 통해 대량의 데이터를 효율적으로 로드하고 업데이트할 수 있습니다.
- 고정 용량/비용 SQL 엔진: Redshift는 기본적으로 고정 용량 및 비용을 갖는 SQL 엔진입니다. 이는 사용자가 원하는 용량을 선택하고 그에 따라 고정된 비용을 지불하는 형태입니다. 그러나 최근에는 가변 비용 옵션인 Redshift Serverless도 제공됩니다. 이는 필요에 따라 자동으로 용량을 조절하여 유연성과 저렴한 비용을 제공합니다.
- 데이터 공유 기능 (Datashare): Redshift는 데이터 공유 기능인 Datashare를 제공합니다. 이를 통해 다른 AWS 계정과 특정 데이터를 공유할 수 있습니다. 이 기능은 Snowflake의 기능을 따라간 것으로, 데이터 공유를 통해 다른 조직이나 부서 간에 데이터를 쉽게 공유하고 협업할 수 있습니다.
- Primary Key의 고유성 보장하지 않음: Redshift는 다른 데이터 웨어하우스와 달리 Primary Key의 고유성을 보장하지 않습니다. 즉, Redshift에서는 Primary Key 중복을 허용합니다. 이는 프로덕션 데이터베이스에서 주로 기대되는 기능이 아닙니다. 대신 Redshift는 대규모 데이터 분석과 쿼리를 위해 설계되었습니다.
Redshift의 이러한 특징들은 데이터 웨어하우스 및 분석 작업에 유용하게 사용될 수 있으며, 데이터 공유 기능과 벌크 업데이트 기능은 유연성과 효율성을 높여줍니다. 그러나 프로덕션 데이터베이스로 사용할 때는 주의해야하며, Primary Key의 고유성을 보장받기 위해서는 다른 솔루션을 고려해야 합니다.
1 - 1. Redshift는 SQL 기반 관계형 데이터베이스
Redshift는 SQL 기반의 관계형 데이터베이스으로 다음과 같은 특징들을 갖고 있습니다:
- Postgresql 8.x와의 호환성: Redshift는 Postgresql 8.x와 SQL 호환성을 가지고 있습니다. 이는 기존에 Postgresql 8.x에서 사용되던 SQL 문법과 동일하게 Redshift에서도 사용할 수 있다는 것을 의미합니다. 그러나 Redshift는 모든 Postgresql 8.x의 기능을 지원하지는 않습니다. 예를 들어, Redshift에는 text 타입이 존재하지 않습니다. 따라서 일부 기능은 호환되지 않을 수 있습니다.
- 액세스 가능한 툴과 라이브러리: Redshift는 Postgresql 8.x를 지원하는 다양한 툴과 라이브러리를 통해 액세스할 수 있습니다. 이를 통해 기존에 Postgresql 8.x를 사용하던 개발자들은 익숙한 도구를 사용하여 Redshift에 접근하고 데이터를 관리할 수 있습니다. JDBC와 ODBC를 통한 액세스도 가능합니다.
- SQL이 메인 언어: Redshift에서는 여전히 SQL이 주요 언어입니다. SQL을 사용하여 데이터를 쿼리하고 조작하는 작업을 수행합니다. 따라서 Redshift를 사용하는 경우 데이터 모델링과 테이블 디자인은 아주 중요한 요소입니다. 데이터 모델을 효율적으로 구성하고 적절한 인덱스와 관계를 설정하는 것은 쿼리 성능과 데이터 처리의 효율성에 직접적인 영향을 미칩니다.
Redshift의 SQL 호환성과 Postgresql 8.x와의 관련은 기존 Postgresql 사용자들에게 익숙한 환경을 제공하여 마이그레이션을 용이하게 만들어줍니다. 그러나 Redshift는 데이터 웨어하우스로 사용되는 것을 목적으로 하기 때문에 일부 기능이 제한될 수 있으며, 데이터 모델링과 쿼리 최적화에 충분한 주의가 필요합니다.
2. Redshift의 스케일링 방식
"스케일 아웃 (Scale Out)" 방식을 사용합니다. 예를 들어, 초기에는 단일 노드로 구성된 클러스터인 경우에는 용량이 제한적이며, 용량이 부족해지면 추가 노드를 클러스터에 추가하여 용량을 확장할 수 있습니다. 이를 "스케일 아웃"이라고 합니다.
예를 들어, dc2.large 인스턴스 한 대는 최대 0.16TB의 용량을 가질 수 있습니다. 용량이 부족해지면 다음과 같은 방법으로 스케일 아웃할 수 있습니다
- dc2.large 한 대를 추가로 추가하여 클러스터를 확장하면, 총 0.32TB의 용량을 갖게 됩니다. (스케일 아웃)
- 또는 더 높은 사양의 인스턴스로 업그레이드하여 기존 인스턴스를 교체할 수 있습니다. 예를 들어, dc2.8xlarge로 교체하면 용량과 성능이 더욱 향상됩니다. (스케일 업)
Redshift는 Auto Scaling 옵션을 제공하여 용량 조정을 자동화할 수도 있습니다. Auto Scaling을 설정하면 시스템이 자동으로 용량을 조정하여 데이터베이스 작업량에 따라 적절한 용량을 유지합니다.
Redshift의 스케일링 방식은 Snowflake나 BigQuery와는 다릅니다. Redshift는 용량이 정해져 있지 않고 쿼리를 처리하기 위해 사용한 리소스에 대한 비용을 지불하는 방식을 채택하고 있습니다. 이는 예측 가능한 용량이 없어 비용의 예측이 어렵다는 단점이 있습니다. 반면에 Snowflake와 BigQuery는 보다 유연한 스케일링을 제공하여 필요에 따라 용량을 자동으로 조정하며 비용을 관리할 수 있습니다.
또한, Redshift에는 가변비용 옵션인 "Redshift Serverless"도 존재합니다. Redshift Serverless는 필요한 만큼의 리소스만 사용하고 그에 따라 비용을 지불하는 방식으로 동작합니다. 이는 "Pay as You Go" 모델을 따르며, 예상치 못한 작업 부하가 발생할 때 유용하게 사용될 수 있습니다.
2 - 1. Redshift 최적화는 굉장히 복잡
Redshift가 두 대 이상의 노드로 구성되면 한 테이블의 레코드들은 분산 저장됩니다. 이를 "분산 저장 (Distribution)"이라고 합니다. 분산 저장은 Redshift 클러스터의 노드들 간에 데이터를 균등하게 분배하여 저장하는 방식입니다. 각 노드는 테이블의 일부 데이터를 보유하고 있으며, 데이터의 분산 저장은 쿼리 성능과 확장성을 향상시키는 중요한 요소입니다.
또한, 한 노드 내에서는 데이터의 순서를 정렬하여 저장해야 합니다. 이를 "정렬 키 (Sort Key)"라고 합니다. 정렬 키는 테이블의 데이터를 효율적으로 조회하고 조인할 수 있도록 도와줍니다. Redshift는 정렬 키를 기반으로 데이터를 노드 내에서 정렬하고 저장하므로 쿼리 성능을 향상시키는 역할을 합니다.
Redshift에서는 데이터의 분산 저장 방식과 정렬 키를 설정하여 테이블의 최적화를 수행할 수 있습니다. 이를 통해 쿼리의 처리 속도를 최적화하고 데이터의 접근 및 조인 성능을 향상시킬 수 있습니다. 최적화는 Redshift의 성능과 확장성을 극대화하는데 매우 중요한 요소이며, 복잡한 성능 튜닝 및 데이터 모델링을 수반할 수 있습니다.
3. Redshift의 레코드 분배와 저장 방식
Redshift에서 테이블의 레코드 분배와 저장 방식은 Distkey, Diststyle, Sortkey 세 가지 키워드를 사용하여 설정됩니다.
1. Diststyle (분배 스타일)
Diststyle은 레코드가 어떻게 다수의 노드로 분배되는지를 결정합니다. 다음과 같은 옵션이 있습니다
- ALL: 테이블의 모든 레코드가 모든 노드에 복제됩니다. 이는 작은 테이블이나 조인 연산에서 사용될 수 있습니다.
- EVEN: 레코드가 균등하게 모든 노드에 분배됩니다. 이는 대부분의 테이블에 대해 기본값입니다.
- KEY: 특정 컬럼 값을 기준으로 레코드가 분배됩니다. Distkey로 지정된 컬럼의 값에 따라 레코드가 각 노드에 배치됩니다.
2. Distkey (분배 키)
Diststyle이 KEY로 설정된 경우, Distkey는 어떤 컬럼을 기준으로 레코드가 분배되는지를 지정합니다. 이를 통해 특정 컬럼의 값에 따라 레코드가 다수의 노드로 분산되도록 할 수 있습니다.
3. Sortkey (정렬 키)
Sortkey는 레코드가 한 노드 내에서 어떤 컬럼을 기준으로 정렬되는지를 지정합니다. Sortkey를 설정하면 쿼리의 성능을 향상시키는 동시에 데이터의 압축률을 향상시킬 수 있습니다. 일반적으로 타임스탬프 필드와 같은 선택적인 컬럼이 Sortkey로 사용됩니다.
Diststyle이 KEY로 설정된 경우, Distkey의 선택은 중요합니다. 잘못된 Distkey 선택은 데이터의 분배에 불균형을 일으킬 수 있습니다. 이는 Skew라고 알려진 현상을 초래하며, 분산 처리의 효율성을 감소시킵니다. Skew가 발생하면 몇 개의 노드가 다른 노드보다 더 많은 작업을 수행하게 되므로 전체 시스템의 성능이 저하될 수 있습니다.
반면에 BigQuery나 Snowflake와 같은 데이터베이스 시스템은 개발자가 Distkey와 Sortkey를 직접 지정할 필요가 없습니다. 이러한 시스템은 자체적으로 옵티마이저가 데이터 분배와 정렬을 자동으로 처리하여 최적의 성능을 달성합니다.
3 - 1. Redshift의 레코드 분배와 저장 방식 example
CREATE TABLE my_table (
column1 INT,
column2 VARCHAR(50),
column3 TIMESTAMP,
column4 DECIMAL(18,2)
) DISTSTYLE KEY DISTKEY(column1) SORTKEY(column3);
- 'DISTSTYLE KEY': 레코드의 분배 방식을 Distkey를 기준으로 설정합니다. 즉, column1의 값에 따라 레코드가 분산 저장됩니다.
- 'DISTKEY(column1)': column1을 Distkey로 선택했으므로, 해당 컬럼의 값을 기준으로 레코드가 분배됩니다.
- 'SORTKEY(column3)': column3을 Sortkey로 선택했으므로, 레코드는 한 노드 내에서 column3의 값에 따라 정렬되어 저장됩니다
이 설정에 따라 Redshift는 my_table의 레코드를 다수의 노드로 분산하여 저장합니다. column1의 값을 기준으로 분배되며, 같은 노드(슬라이스) 내에서는 column3의 값에 따라 정렬되어 저장됩니다. 이를 통해 자주 함께 조회되는 레코드들이 같은 노드에 저장되고, column3을 기준으로 정렬된 데이터에 대한 쿼리 성능이 향상됩니다.
이와 같이 Redshift에서 Distkey와 Sortkey를 올바르게 설정하면 데이터의 분배와 저장 방식을 최적화하여 쿼리 성능을 향상시킬 수 있습니다.
4. Redshift의 벌크 업데이트 방식 - COPY SQL
Redshift에서 벌크 업데이트를 수행하는 방법으로는 COPY SQL 문을 사용하는 것이 일반적입니다. COPY 문은 S3나 기타 지원되는 소스에서 데이터를 Redshift로 일괄적으로 복사하는 데 사용됩니다.
COPY 문을 사용하여 데이터를 Redshift로 로드하는 프로세스는 다음과 같습니다.
- 데이터 준비: 복사할 데이터를 S3에 업로드하거나 기타 지원되는 소스로부터 데이터를 가져옵니다.
- COPY 문 작성: COPY 문을 사용하여 데이터를 Redshift로 로드하기 위한 SQL 문을 작성합니다. 이 SQL 문에는 데이터의 소스 및 대상 정보, 데이터 형식, 옵션 등이 포함됩니다.
- 스케줄링: COPY 문을 실행하는 스케줄링 도구인 cronjob, 스케줄러(Airflow) 등을 사용하여 작업을 예약합니다. 이를 통해 정기적으로 데이터 업데이트를 자동화할 수 있습니다.
- 데이터 로드: 예약된 시간에 COPY 문이 실행되어 데이터가 Redshift로 로드됩니다. COPY 문은 병렬로 실행되어 대량의 데이터를 효율적으로 로드할 수 있습니다.
데이터 파이프라인 프레임워크를 사용하면 데이터 소스에서 Redshift로의 데이터 이동 및 변환 과정을 자동화할 수 있습니다. 이를 통해 데이터 업데이트 프로세스를 관리하고 모니터링할 수 있습니다. 예를 들어 Apache Airflow는 데이터 파이프라인을 구축하고 스케줄링하며, COPY SQL 문을 실행하여 Redshift로 데이터를 로드하는 작업을 자동화하는 데 사용될 수 있습니다.
Redshift의 COPY SQL 문과 데이터 파이프라인 프레임워크를 결합하면 대량의 데이터를 효율적으로 업데이트하고 Redshift 데이터 웨어하우스를 유지 관리할 수 있습니다.
5. Redshift의 기본 데이터 타입
- SMALLINT (INT2): 작은 정수를 나타내는 데이터 타입입니다.
- INTEGER (INT, INT4): 일반적인 정수를 나타내는 데이터 타입입니다.
- BIGINT (INT8): 큰 정수를 나타내는 데이터 타입입니다.
- DECIMAL (NUMERIC): 고정 소수점 숫자를 나타내는 데이터 타입입니다.
- REAL (FLOAT4): 단정밀도 부동 소수점 숫자를 나타내는 데이터 타입입니다.
- DOUBLE PRECISION (FLOAT8): 배정밀도 부동 소수점 숫자를 나타내는 데이터 타입입니다.
- BOOLEAN (BOOL): 논리값을 나타내는 데이터 타입으로, true 또는 false 값을 가집니다.
- CHAR (CHARACTER): 고정 길이 문자열을 나타내는 데이터 타입입니다.
- VARCHAR (CHARACTER VARYING): 가변 길이 문자열을 나타내는 데이터 타입입니다.
- TEXT (VARCHAR(256)): 긴 가변 길이 문자열을 나타내는 데이터 타입입니다. 일반적으로 VARCHAR보다 큰 용량의 문자열을 저장할 때 사용됩니다.
- DATE: 날짜를 나타내는 데이터 타입입니다.
- TIMESTAMP: 날짜와 시간을 나타내는 데이터 타입입니다.
이러한 데이터 타입을 사용하여 Redshift에서 다양한 유형의 데이터를 저장하고 처리할 수 있습니다.
5 - 1. Redshift의 고급 데이터 타입
Redshift는 몇 가지 고급 데이터 타입을 지원합니다. 이러한 데이터 타입은 특정 유형의 데이터를 처리하고 저장하기 위해 사용됩니다. 다음은 Redshift의 고급 데이터 타입 목록입니다
- GEOMETRY: 공간 데이터를 나타내는 데이터 타입으로, 점, 선, 다각형 등의 공간 정보를 저장할 수 있습니다. 이를 통해 지리적인 데이터를 처리하고 분석할 수 있습니다.
- GEOGRAPHY: 지리적인 위치 정보를 나타내는 데이터 타입입니다. 위도와 경도 값과 같은 지리 정보를 저장하고 처리할 수 있습니다. 지리적인 위치 데이터를 기반으로 위치 인식 쿼리를 수행하거나 공간 분석을 수행할 수 있습니다.
- HLLSKETCH: HyperLogLog(HLL) 알고리즘을 사용하여 고유한 값의 근사치를 저장하는 데이터 타입입니다. 이를 통해 대량의 고유 값의 개수를 추정하고 집계 작업을 효율적으로 수행할 수 있습니다.
- SUPER: 다른 테이블의 참조를 나타내는 데이터 타입으로, 외래 키 관계를 나타내기 위해 사용됩니다. SUPER 데이터 타입을 사용하여 다른 테이블의 행에 대한 참조를 유지하고 조인 작업을 수행할 수 있습니다.
이러한 고급 데이터 타입을 사용하여 Redshift에서 특정 유형의 데이터를 처리하고 저장할 수 있으며, 적합한 데이터 모델링과 쿼리 작성을 통해 고급 기능을 활용할 수 있습니다.