본문 바로가기

데이터엔지니어링

[11주차] 하둡과 Spark (4)

🙂 Spark 파일 포맷

Unstructured: Text

Semi-structured: JSON, XML, CSV

Structured: PARQUET, AVRO, ORC, SequenceFile


🙂 Execution Plan

✔ Transformations and Actions

  • Transformations
    • Narrow Dependencies: 독립적인 Partition Level 작업
      • select, filter, map 등
    • Wide Dependencies: Shuffling이 필요한 작업
      • groupby, reduceby, partitionby, repartition, coalesce 등
  • Actions
    • Read, Write, Show, Collect -> Job을 실행시킴 (실제 코드가 실행)
    • Lazy Execution
      • 어떤 장점이 존재할까?
        • 더 많은 오퍼레이션을 볼 수 있기에 최적화를 더 잘할 수 있음. SQL이 선호

 

Action -> Job -> Stage -> Task


🙂 Bucketing과 File System Partitioning

  • Bucketing
    • 먼저 Aggregation이나 Window함수나 Join에서 많이 사용되는 컬럼이 있는지
    • 있다면 데이터를 이 특정 컬름을 기준으로 테이블로 저장
      • 이 때의 버킷의 수도 지정
  • File System Partitioning
    • Hive에서 많이 사용
    • 데이터의 특정 컬럼을 기준으로 폴더 구조를 만들어 데이터 저장 최적화
      • 위의 컬럼을 Partition Key 라고 부름

✔ Bucketing

DataFrame을 특정 ID를 기준으로 나눠서 테이블로 저장

  • 다음부터는 이를 로딩하여 사용함으로써 반복 처리시 시간 단축
    • DataFrameWriter의 bucketBy 함수 사용
  • 데이터의 특성을 잘 알고 있는 경우 사용 가능

✔ File System Partitioning

  • 데이터를 Partition Key 기반 폴더 ('Partition') 구조로 물리적으로 나누어 저장
    • Hive에서 사용하는 Partitioning을 말함
  • Partitioning의 예와 이점
    • 굉장히 큰 로그 파일을 데이터 생성시간 기반으로 데이터 읽기를 많이 한다면?
      • 데이터 자체를 연도-월-일의 폴더 구조로 저장
      • 보통 위의 구조로 이미 저장되는 경우가 많음
    • 이를 통해 데이터 읽기 과정 최적화
    • 데이터 관리도 쉬워짐 (Retention Policy 적용시)
  • DataFrameWriter의 partitionBy 사용
    • Partition key를 잘못 선택하면 너무 많은 파일 생성