[Spark] Bucketing과 Partitioning

HDFS 상에 어떤 형태로 데이터가 저장되거나 존재하는가를 고려하여 데이터구조 최적화할 수 있다. 

이때 사용하는 방식으로 BucketingPartitioning이 있다.

Bucketing

  • 셔플링을 줄이기 위해서 사용 (컬럼 기준 재분배)
  • Aggregation이나 Window 함수, JOIN 에서 많이 사용되는 컬럼이 있는지 확인하고 있다면 DataFrame을 특정 컬럼(들)을 기준으로 나눠서 테이블로 저장
    • Bucket의 수기준 ID 지정 필요 ⇨ DataFrameWriterbucketBy 함수 사용
  • 지정된 버킷의 수만큼 HDFS 파티션 생성

File System Partitioning

  • 지금까지 배운 내용에서 partition은 데이터프레임을 나눠 저장할 때 단위로 사용되었다면, 
  • ▶️ 여기서 이야기 하는 File System에 저장되는 데이터를 특정 컬럼(들)을 기준으로 물리적으로 나눠 저장하는 것을 말한다. (컬럼기준 디렉토리 구성)
  • 특정 컬럼을 기준으로 데이터 조회 등이 많다고 할 때 이 컬럼을 기준으로 폴더 구조를 만들어 데이터 저장을 최적화한다.
    • 이 컬럼을 Partition Key라고 함
    • 데이터 생성시간 기반으로 데이터 읽기를 많이 한다면 연도-월-일-시간의 폴더 구조로 저장
  • 데이터 읽기 과정을 최적화(스캐닝 과정이 줄어들거나 없어짐)
  • Retention Policy 적용시에 날짜별로 구분이 되어있어서 특정 날짜 기준으로 필터링 등 데이터 관리가 쉬워짐
  • DataFrameWriterpartitionBy 사용
    • cardinality가 낮은 키를 선택해서 Partition Key로 사용
    • Partition Key를 기준으로 파일이 생성
  • HIVE에서 사용하는 Partitioning을 말함