Spark( RDD vs DataFrame vs Dataset)

Q·2023년 11월 23일
0

이전 나의 스파크의 작업 흐름을 설명하라는 질문의 답변

스파크 애플리케이션의 시작은 사용자 요구에 따라 결정됩니다. 사용자 수준에서 RDD 기반의 세밀한 제어가 필요하면 SparkContext를, 그렇지 않다면 SparkSession을 생성하여 스파크의 진입점을 설정합니다. 이후 데이터를 처리할 필요에 따라 map과 같은 변환(transformation)을 사용해 데이터를 원하는 형태로 파싱합니다. 필요한 경우, repartition과 같은 파티션 재분배 작업을 통해 데이터를 다시 분산시키고, 셔플링(shuffling)을 통해 데이터를 정렬하거나 그룹화하여 연산을 최적화합니다. 마지막으로 reduce와 같은 액션(action)을 통해 결과를 도출합니다.

RDD

  • Resilient: 분산되어 있는 데이터에 에러가 생겨도 복구할 수 있는 능력
  • Distributed: 클러스터의 여러 노드에 데이터를 분산해서 저장
  • Dataset: 분산된 데이터의 모음

SparkContext를 통해 만들어지며 보통 sc=spark.SparkContext를 통해 객체를 생성한다

RDD를 사용하는 3가지 상황

  1. 높은 레벨의 API에서 찾을 수 없는 어떠한 기능이 필요할 때 사용(mysql의 upsert와 같은 기능),(map함수 내지 특정 기능사용)
    ex) 클러스터를 통해 물리적 데이터선정을 빡빡하게 제어해야될 때)
  2. RDD를 기반으로 짠 기존 코드를 유지해야 할 때
  3. shared variable 조작을 설정해야될 때.

RDD 특징

  • Java, Scala의 객체를 처리하는 방식
  • 함수를 1) Transformation 2) Action으로 나눠 Action에 해당하는 함수를 호출할 때 실행된다.
  • transformation의 결과는 RDD로 생성
  • 내부에 데이터 타입이 명시
  • 쿼리 최적화등을 지원하지 않았음(카탈리스트 옵티마이저 X)
  • Pyspark에서 UDF선언시 인터프리터와 JVM사이 커뮤니케이션으로 속도가 저하됨( Python의 경우 Scala의 2배), 반드시 built in 함수만 쓸 것
  • 병렬적으로 처리한다
  • immutable(수정할 수 없다)
  • lineage를 통한 fault tolerent를 보장함으로써 속도가 빠르다.
  • Transformation:
    RDD에서 새로운 RDD를 생성하는 함수,
    스파크의 동작중에서 데이터를 처리하는 명령
    ex) map, filter, flatMap, join
  • Action:
    RDD에서 RDD가 아닌 타입의 data로 변환하는 함수,
    Transformation의 결과를 저장하는 명령
  • action이 일어날 때, transformation함수가 memory에 비로소 올라오게 된다.
    ex) count, collect, reduce, save

DataFrame

  • SparkSession을 통해 만들어지는 데이터 타입
  • 대부분의 경우에 dataframe을 사용(테이블 생성을 통한 SQL질의도 가능하기 때문)

dataframe 특징

  • 내부 데이터가 Row라는것만 명시, 실제 데이터 타입은 알 수 없음
  • 스키마 추상화
  • Python Wrapper코드로 Python에서의 성능이 향상되었다.
  • Dataset 제네릭 객체 집합에 대한 별칭
  • RDD와 마찬가지로 Pyspark에서 함수를 선언해서 사용할 경우(UDF), 속도 저하의 원인이 될 수 있다.
  • 카탈리스트 옵티마이저 지원
  • 테이블과 같이 구성되어 있기 때문에, SparkSQL을 통해 사용할 수 있다(RDBMS에 익숙한 사람들의 경우 편리함)
  • RDB처럼 테이블을 가질 수 있으며, 테이블에 대한 연산이 가능하다.
  • Named Column으로 구성
  • immutable(수정될 수 없다.)
  • lineage를 통해 lazy하게 작동한다.(계산 혹은 기능에 대한 계보를 저장하고 바로 실행되지는 않는다.즉 결과를 바로 돌려주지않는다) -> transformation과 action의 분할

Dataframe은 python pandas 에 쓰이는 dataframe과 유사하지만 완전히 같지는 않다.

Dataset

사용 되는 경우

  1. 데이터프레임 조작을 통해 원하는 수행을 할 수 없을 때.
  2. type-saftey를 원할때, type-safety를 대가로 그만한 비용(자원)을 감당할 수 있을 때

(dataframe은 dataset의row타입이다.)

dataset 특징

  • 데이터타입이 명시되어야함
  • 스키마 추상화
  • Scala/Java에서 정의한 클래스에 의해 타입을 명시해야하는 JVM객체. 따라서 Python은 지원하지 않음.
  • 카탈리스트 옵티마이저 지원
  • Type-safe
  • RDD와 Dataframe의 장점을 취한다.

참고

profile
Data Engineer

0개의 댓글