Partitioning & Bucketing
- Spark와 같은 분산 데이터 처리 시스템에서 데이터를 분할하는 개념
- 데이터의 분산 저장 및 쿼리 성능 최적화에서 중요한 역할
Partitioning
- 데이터를 물리적으로 여러 파티션에 나누어 저장하는 방식
- Spark에서 파티션은 데이터가 클러스터의 여러 노드에 분산되어 처리되는 기본 단위
- 일반적으로 연산 최적화와 병렬 처리를 위해 사용됨
- 특징
- 파티셔닝 기준 : 데이터를 특정 컬럼을 기준으로 나눔 -> 적절한 cardinality를 갖는 컬럼
- 자동 또는 수동 설정
- repartition()이나 coalesce()같은 함수를 통해 파티션 수를 설정하거나 변경 가능
- 데이터를 특정 컬럼에 맞게 파티셔닝 하려면 partitionBy()를 사용
- 사용 목적
- 데이터가 커질 때 병렬 처리 성능을 개선하기 위해 사용
- 동일한 파티션 내에서 작업을 병렬로 처리하면 더 빠른 속도로 데이터 처리 가능
- 예시
# 데이터를 'year' 컬럼을 기준으로 파티셔닝
df.write.partitionBy("year").parquet("/path/to/output")
- 장점
- 병렬 처리 성능 향상 : 동일한 파티션 내에서 데이터를 병렬로 처리할 수 있어 성능 향상
- 효율적인 데이터 접근
- 파티션을 기준으로 쿼리 최적화 가능
- 특정 파티션만 읽으면 되기에, 데이터 접근 속도 향상
- 단점
- 파티션의 수에 따라 성능 변동
- 파티션 수가 너무 많거나 적으면 작업 성능 저하
- 적절한 파티션 수 설정이 중요
- 파티션의 수에 따라 성능 변동
Bucketing
- 데이터를 특정 컬럼의 해시 값을 기준으로 나누는 방식
- 일반적으로, 쿼리 성능을 최적화하는 데 사용
- 특징
- 해시 기반 분할 : 데이터를 나누는 기준이 특정 컬럼 값이 아니라 해당 값의 해시 값
- 정적 파티셔닝 : 데이터를 나누는 과정에서 동적 재배치 없이 고정된 수의 버킷 설정
- 사용 목적 : 주로 조인 최적화나 분산 쿼리 성능을 높이는 데 사용
- 예시
# 데이터를 'user_id'를 기준으로 10개의 버킷으로 나누어 저장
df.write.bucketBy(10, "user_id").sortBy("user_id").saveAsTable("bucketed_table")
- 장점
- 효율적인 조인 처리 : 두 테이블을 같은 방식으로 버킷팅하면, 조인할 때 Shuffle 최소화 가능 -> 조인 성능 향상 가능
- 빠른 쿼리 : 특정 컬럼을 기준으로 데이터를 분할하여 저장하고, 그 컬럼에 대해 쿼리 성능이 향상됨
- 단점
- 정적 분할
- 버킷 수 고정
- 데이터 분포가 불균형할 수 있음
- 성능 문제 : 버킷 수를 잘못 설정하면, 성능에 영향 발생
- 정적 분할
'데이터 > Spark' 카테고리의 다른 글
[Spark] 8. Spark with AWS (0) | 2024.12.03 |
---|---|
[Spark] 6. Spark Execution Plan (0) | 2024.12.03 |
[Spark] 5. File Format (0) | 2024.12.03 |
[Spark] 4. Database & Table (2) | 2024.12.03 |
[Spark] 3. Spark SQL (0) | 2024.12.02 |