데이터엔지니어링

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

heecup 2024. 6. 18. 13:33

🙂 Spark 프로그래밍

Spark 아키텍처

✔ 데이터 병렬처리

  • 데이터가 먼저 분산되어야 함
    • 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록 (128MB)
      • hdfs-site.xml에 있는 dfs.block.size 프로퍼티가 결정
    • Spark에서는 이를 Partition이라 부름. (128MB)
      • spark.sql.files.maxPartitionBytes: HDFS 등에 있는 파일을 읽어올 때만 적용
  • 나눠진 데이터를 각각 따로 동시 처리
    • 맵리듀스에서 N개의 데이터 블록으로 구성된 파일 처리 시 N개의 Map 태스크가 실행
    • Spark에서는 파티션 단위로 메모리로 로드되어 Executor가 배정

🍦 처리 데이터를 나누기 -> 파티션 -> 병렬처리

 

✔ Spark 데이터 처리 흐름

  • 데이터프레임은 작은 파티션들로 구성됨
    • 데이터프레임은 한 번 만들어지면 수정 불가 (Immutable)
  • 입력 데이터프레임을 원하는 결과 도출까지 다른 데이터프레임으로 계속 변환
    • sort, group by, filter, map, join, ...

🍦 셔플링

  • 파티션 간에 데이터 이동이 필요한 경우
    • 명시적 파티션을 새롭게 하는 경우 (예: 파티션 수를 줄이기)
    • 시스템에 의해 이루어지는 셔플링
      • 예를 들면 그룹핑 등의 aggregation이나 sorting
  • 셔플링이 발생할 때 NW을 타고 데이터 이동
    • 몇 개의 파티션이 결과로 만들어질까
    • spark.sql.shuffle.partitions이 결정 (default: 200)
    • 오퍼레이션에 따라 파티션 수 결정
      • random, hashing partition, range partition 등
    • Data Skew 발생 가능

🙂 Spark 데이터 구조

  • RDD (Resilient Distributed Dataset)
    • Low Level 데이터로 클러스터 내의 서버에 분산된 데이터를 지칭
    • 레코드별로 존재하지만 스키마 존재 X
      • 구조화된 데이터나 비구조화된 데이터 모두 지원
    • 변경이 불가능한 분산 저장된 데이터
      • RDD는 다수의 파티션으로 구성
      • Low Level의 함수형 변환 지원 (map, filter, flatMap 등)
    • 일반 파이썬 데이터는 parallelize 함수로 RDD로 변환
      • 반대는 collect로 파이썬 데이터로 변환 가능
  • DataFrame과 Dataset
    • RDD위에 만들어지는 RDD와는 달리 필드 정보(컬럼)를 갖고 있음
    • Dataset은 타입 정보가 존재

 

 

🙂 Spark Session

  • Spark 프로그램의 시작은 Spark Session을 만드는 것
    • 프로그램마다 하나를 만들어 Spark Cluster와 통신: Singleton 객체
    • Spark 2.0에서 처음 소개됨
  • Spark Session을 통해 Spark이 제공해주는 다양한 기능을 사용
    • DataFrame, SQL, Streaming, ML API 모두 이 객체로 통신
    • config 메소드를 이용해 다양한 환경설정 가능
    • 단 RDD와 관련된 작업을 할 때는 SparkSession 밑의 sparkContext 객체 사용

🍦 환경 변수

  • executor별 메모리: spark.executor.memory (default: 1g)
  • executor별 CPU: spark.executor.cores (default: 1)
  • driver 메모리: spark.driver.memory (default: 1g)
  • Shuffle 후 Partition의 수: spark.sql.shuffle.partitions (default: 200)

전체적인 플로우

  • SparkSession 만들기
  • 입력 데이터 로딩
  • 데이터 조작 작업
    • DataFrame API나 Spark SQL 사용
  • 최종 결과 저장