본문 바로가기
BigData/Spark & Spark Tuning

[BigData] Spark( RDD vs DataFrame vs Dataset)

by 스파이디웹 2021. 2. 15.
728x90

출처 : A comparison between RDD, DataFrame and Dataset in Spark from a developer’s point of view


RDD

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

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

SparkSession을 import해도 SparkContext가 포함되어 있는 내용이라 SparkSession만 import해도 사용가능하긴 하다.

ex)

spark = SparkSession.builder.appName("이름").master("local[*]").getOrCreate()
sc = spark.SparkContext
lines = sc.textfile("주소".파일형식) #lines는 RDD타입으로 만들어지게 된다.

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

RDD의 개념

www.slideshare.net/yongho/rdd-paper-review

 

Spark 의 핵심은 무엇인가? RDD! (RDD paper review)

요즘 Hadoop 보다 더 뜨고 있는 Spark. 그 Spark의 핵심을 이해하기 위해서는 핵심 자료구조인 Resilient Distributed Datasets (RDD)를 이해하는 것이 필요합니다. RDD가 어떻게 동작하는지, 원 논문을 리뷰하며

www.slideshare.net


DataFrame

  • SparkSession을 통해 만들어지는 데이터 타입
  • 대부분의 경우에 dataframe을 사용(테이블 생성을 통한 SQL질의도 가능하기 때문)
spark = SparkSession.builder.appName("이름").master("local[*]").getOrCreate()
df = spark.read.format("형식").option("옵션","true").load("주소.파일형식")
#df는 dataframe타입으로 만들어지게 된다.

 


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을 지원하지 않는대신 from pyspark.sql import Row를 통해 대부분 지원을 한다.

dataset 특징

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

출처:

lisa-devnote.tistory.com/8

 

728x90

댓글