데이터 파티셔닝
데이터 파티셔닝이란 무엇인가요?
데이터 파티셔닝은 대규모 데이터세트를 파티션이라고 하는 더 작고 관리하기 쉬운 세그먼트로 나누는 기법입니다. AWS Glue 제로 ETL 통합의 컨텍스트에서 파티셔닝은 특정 열 값 또는 해당 값의 변환을 기반으로 대상 위치에서 데이터를 구성합니다.
데이터 파티셔닝의 이점
효과적인 데이터 파티셔닝은 분석 워크로드에 몇 가지 주요 이점을 제공합니다.
-
쿼리 성능 향상: 쿼리는 관련 없는 파티션을 건너뛸 수 있으므로(파티션 정리) 스캔해야 하는 데이터의 양이 줄어듭니다.
-
비용 절감: 스캔하는 데이터가 줄어들면 분석 쿼리에 대한 컴퓨팅 및 I/O 비용을 절감할 수 있습니다.
-
확장성 향상: 파티셔닝을 통해 데이터 세그먼트를 병렬 처리할 수 있으므로 분석 워크로드를 더 효율적으로 확장할 수 있습니다.
-
간소화된 데이터 수명 주기 관리: 파티션 수준에서 보존 정책을 관리할 수 있으므로 이전 데이터를 더 간편하게 보관하거나 삭제할 수 있습니다.
주요 파티셔닝 개념
- 파티션 열
-
레코드가 파티션으로 구성되는 방식을 결정하는 데 사용되는 데이터의 열입니다. 효과적인 파티션 열은 일반적인 쿼리 패턴과 일치해야 하며 적절한 카디널리티가 있어야 합니다.
- 파티션 함수
-
파티션 열 값에 변환을 적용하여 실제 파티션 경계를 생성합니다. 예를 들어 자격 증명(원시 값 사용), 시간 기반 함수(year, month, day, hour)가 있습니다.
- 파티션 정리
-
쿼리 엔진이 쿼리와 관련된 데이터가 포함되지 않은 파티션을 식별하고 건너뛰어 성능을 개선하는 프로세스입니다.
- 분할 영역 세분성
-
데이터가 파티셔닝되는 세부 수준입니다. 더 세밀한 세분화(파티션 수가 많을수록)는 쿼리 성능을 개선할 수 있지만 메타데이터 오버헤드가 증가할 수 있습니다. 덜 세밀한(파티션 수가 적을수록) 메타데이터 오버헤드는 줄어들지만 필요 이상으로 많은 데이터를 스캔하게 될 수 있습니다.
AWS Glue 제로 ETL 통합의 파티셔닝
AWS Glue 제로 ETL 통합은 고급 파티셔닝 기능을 제공하는 Apache Iceberg 테이블 형식을 사용합니다. 제로 ETL 통합을 생성하면 다음을 수행할 수 있습니다.
-
데이터 소스에 최적화된 기본 파티셔닝 전략 사용
-
쿼리 패턴에 맞는 사용자 지정 파티셔닝 사양 정의
-
파티션 열에 변환 적용(타임스탬프 기반 파티셔닝에 특히 유용)
-
다중 수준 파티셔닝을 위한 여러 파티션 전략 결합
파티셔닝 구성은 제로 ETL 통합을 설정할 때 CreateIntegrationTableProperty
API를 통해 지정됩니다. 구성이 완료되면 AWS Glue는 이러한 파티셔닝 전략을 자동으로 적용하여 대상 위치에서 데이터를 구성합니다.
파티셔닝 사양 API 참조
CreateIntegrationTableProperties API에서 다음 파라미터를 사용하여 파티셔닝을 구성합니다.
- PartitionSpec
-
대상 위치에서 데이터를 파티셔닝하는 방법을 정의하는 파티션 사양의 배열입니다.
{ "partitionSpec": [ { "fieldName": "timestamp_col", "functionSpec": "month", "conversionSpec": "epoch_milli" }, { "fieldName": "category", "functionSpec": "identity" } ] }
- FieldName
-
파티셔닝에 사용할 열 이름을 지정하는 UTF-8 문자열(1~128바이트)입니다.
- FunctionSpec
-
파티셔닝 함수를 지정합니다. 유효한 값:
identity
- 변환 없이 소스 값을 직접 사용year
- 타임스탬프 값에서 연도 추출(예: 2023)month
- 타임스탬프 값에서 월 추출(예: 2023-01)day
- 타임스탬프 값에서 날짜 추출(예: 2023-01-15)hour
- 타임스탬프 값에서 시간 추출(예: 2023-01-15-14)
참고
시간 기반 함수(
year
,month
,day
,hour
)는 소스 타임스탬프 형식을 지정하는 데ConversionSpec
파라미터가 필요합니다. - ConversionSpec
-
소스 데이터의 타임스탬프 형식을 지정하는 UTF-8 문자열입니다. 유효한 값은 다음과 같습니다.
-
epoch_sec
- 초 단위의 Unix 에포크 타임스탬프 -
epoch_milli
- 밀리초 단위의 Unix 에포크 타임스탬프 -
iso
- ISO 8601 형식의 타임스탬프
-
파티셔닝 전략
기본 파티셔닝
파티션 열을 지정하지 않으면 AWS Glue 제로 ETL은 데이터 소스에 최적화된 기본 파티셔닝 전략을 적용합니다.
-
프라이머리 키 기반 파티셔닝: 프라이머리 키가 있는 소스(예: DynamoDB 테이블)의 경우 AWS Glue 제로 ETL은 파티션 폭발을 방지하기 위해 버킷팅이 있는 프라이머리 키를 사용하여 데이터를 자동으로 파티셔닝합니다.
기본 파티셔닝은 수동으로 구성할 필요 없이 일반적인 쿼리 패턴에 잘 작동하도록 설계되었습니다. 그러나 특정 쿼리 패턴 또는 성능 요구 사항의 경우 사용자 지정 파티셔닝 전략을 정의할 수 있습니다.
사용자 정의 파티셔닝 전략
AWS Glue 제로 ETL을 사용하면 PartitionSpec
파라미터를 사용하여 사용자 지정 파티셔닝 전략을 정의할 수 있습니다. 하나 이상의 파티션 열을 지정하고 각 열에 서로 다른 파티셔닝 함수를 적용할 수 있습니다.
자격 증명 파티셔닝은 열의 원시 값을 사용하여 파티션을 생성합니다. 이 전략은 범주, 리전 또는 상태 필드와 같이 카디널리티가 낮거나 중간 정도인 열에 유용합니다.
예 자격 증명 파티셔닝 예제
{ "partitionSpec": [ { "fieldName": "category", "functionSpec": "identity" } ] }
이렇게 하면 "category" 열의 각 고유 값에 대해 별도의 파티션이 생성됩니다.
주의
카디널리티가 높은 열(예: 프라이머리 키 또는 타임스탬프)에서 자격 증명 파티셔닝을 사용하면 파티션 폭발로 인해 성능이 저하되고 메타데이터 오버헤드가 증가할 수 있으므로 자격 증명 파티셔닝을 사용하지 마세요.
시간 기반 파티셔닝은 다양한 세부 수준(연도, 월, 일 또는 시간)의 타임스탬프 값을 기반으로 데이터를 구성합니다. 이 전략은 시계열 데이터에 이상적이며 효율적인 시간 범위 쿼리를 지원합니다.
시간 기반 파티셔닝을 사용하는 경우 AWS Glue 제로 ETL은 파티션 함수를 적용하기 전에 다양한 타임스탬프 형식을 표준화된 형식으로 자동 변환할 수 있습니다. 이 변환은 ConversionSpec
파라미터를 사용하여 지정됩니다.
예 시간 기반 파티셔닝 예제
{ "partitionSpec": [ { "fieldName": "created_at", "functionSpec": "month", "conversionSpec": "epoch_milli" } ] }
이렇게 하면 Unix 에포크 타임스탬프를 포함하는 "created_at" 열을 기반으로 데이터를 월별로 파티셔닝합니다.
AWS Glue 제로 ETL은 다음과 같은 시간 기반 파티션 함수를 지원합니다.
-
연도: 데이터를 연도별로 파티셔닝(예: 2023, 2024)
-
월: 데이터를 월별로 파티셔닝(예: 2023-01, 2023-02)
-
일: 데이터를 일별로 파티셔닝(예: 2023-01-01, 2023-01-02)
-
시간: 데이터를 시간별로 파티셔닝(예: 2023-01-01-01, 2023-01-01-02)
AWS Glue 제로 ETL은 ConversionSpec
파라미터를 통해 다음과 같은 타임스탬프 형식을 지원합니다.
-
epoch_sec: Unix 에포크 타임스탬프(초 단위)
-
epoch_milli: Unix 에포크 타임스탬프(밀리초 단위)
-
iso: ISO 8601 형식의 타임스탬프
참고
원본 열 값은 소스 데이터에서 변경되지 않습니다. AWS Glue는 대상 데이터베이스 테이블에서 파티션 열 값만 타임스탬프 유형으로 변환합니다. 변환은 파티셔닝 프로세스에만 적용됩니다.
다중 수준 파티셔닝은 여러 파티션 전략을 결합하여 계층 기반 파티셔닝 체계를 생성합니다. 이는 동일한 데이터세트에 대해 서로 다른 유형의 쿼리를 최적화하는 데 유용합니다.
예 다중 수준 파티셔닝 예제
{ "partitionSpec": [ { "fieldName": "created_at", "functionSpec": "month", "conversionSpec": "iso" }, { "fieldName": "region", "functionSpec": "identity" } ] }
이렇게 하면 먼저 월별로("created_at" 열에서), 그리고 리전별로 2단계 파티셔닝 체계가 생성됩니다. 이를 통해 날짜 범위, 특정 리전, 또는 이러한 차원의 조합을 기준으로 필터링하는 효율적인 쿼리가 가능합니다.
다중 수준 파티셔닝 체계를 설계할 때는 다음 사항을 고려하세요.
-
파티션 계층 구조에서 선택성이 높은 열을 먼저 배치
-
파티션 세부 수준과 파티션 수 간 균형 맞추기
-
파티셔닝 체계를 가장 일반적인 쿼리 패턴에 맞도록 조정
모범 사례
파티션 열 선택
-
identity
파티션 함수에는 카디널리티가 높은 열을 사용하지 마세요. ID 파티셔닝과 함께 높은 카디널리티 열을 사용하면 작은 파티션이 많이 생성되어 수집 성능이 크게 저하될 수 있습니다. 카디널리티가 높은 열에는 다음이 포함될 수 있습니다.-
프라이머리 키
-
타임스탬프 필드(예:
LastModifiedTimestamp
,CreatedDate
) -
시스템 생성 타임스탬프
-
-
동일한 열에서 여러 타임스탬프 파티션을 선택하지 마세요. 예:
"partitionSpec": [ {"fieldName": "col1", "functionSpec": "year", "conversionSpec" : "epoch_milli"}, {"fieldName": "col1", "functionSpec": "month", "conversionSpec" : "epoch_milli"}, {"fieldName": "col1", "functionSpec": "day", "conversionSpec" : "epoch_milli"}, {"fieldName": "col1", "functionSpec": "hour", "conversionSpec" : "epoch_milli"} ]
파티션 FunctionSpec/ConversionSpec 선택
-
타임스탬프 기반 파티셔닝 함수를 사용할 때 타임스탬프 기반 파티셔닝에 대해 선택한 열 값의 형식을 나타내는 올바른 ConversionSpec(epoch_sec | epoch_milli | iso)을 지정합니다. AWS Glue 제로 ETL은 파티셔닝 전에 이 파라미터를 사용하여 소스 데이터를 타임스탬프 형식으로 올바르게 변환합니다.
-
데이터 볼륨에 따라 적절한 세분화(년/월/일/시간)를 사용합니다.
-
ISO 타임스탬프를 사용할 때 시간대 영향을 고려합니다. AWS Glue 제로 ETL은 선택한 타임스탬프 열의 모든 레코드 값을 UTC 시간대로 채웁니다.
오류 처리
NEEDS_ATTENTION 상태
다음과 같은 경우 통합이 NEEDS_ATTENTION 상태가 됩니다.
지정된 파티션 열이 소스에 없음
파티션 열의 타임스탬프 변환 실패