Spark 구조적 API

업데이트:

구조적 API 는 다양한 유형의 데이터를 처리할 수 있다. 세 가지 분산 컬렉션 API가 있다.

  • Dataset
  • DataFrame
  • SQL 테이블과 뷰

배치와 스트리밍 처리에서 사용할 수 있고 구조적 API를 활용하면 배치와 스트리밍을 쉽게 변환할 수 있다.

DataFrame, Dataset

  • 불변이다.
  • 실행 계획 수립과 처리에 사용하는 자체 데이터 타입 정보를 가지고 있는 카탈리스트 엔진을 사용한다.
  • JVM 타입 대신 자체 데이터 포맷을 사용하여 GC와 객체 초기화 부하가 적다.
  • 아무튼 최적화된 내부 포맷을 이용할 수 있다.
  • spark 2.0에서 Dataframe은 Dataset으로 흡수되었다.
DataFrame (==Dataset<Row>) Dataset
비타입형 타입형
런타임에 타입 체크 컴파일 타임에 타입 체크
python, R, Java, Spark 스칼라, 자바에서만 지원

실행 과정

  1. 논리적 실행 계획

    사용자 코드를 논리적 실행 계획으로 변경한다. 이 과정에서는 추상적 트랜스포메이션만 표현하고 사용자의 표현식을 최적화한다.(검증 전 논리적 실행 계획)

    spark analyzer는 카탈로그, DataFrame 정보를 활용하여 검증한다(검증된 논리적 실행 계획)

    카탈리스트 옵티마이저는 논리적 실핼 계획을 최적화한다.

  2. 물리적 실행 계획

    논리적 실행 계획을 클러스터 환경에서 실행하는 방법을 정의한다. 다양한 물리적 실행 전략을 생성하고 비용 모델을 이용해서 비교 후 최적의 전략을 선택한다.

    물리적 실행 계획은 일련의 RDD와 트랜스포메이션으로 변환된다.

  3. 실행

    RDD를 대상으로 모든 코드를 실행하고 처리 결과를 반환한다.

RDD

스파크의 저수준 API.

다음과 같은 경우 사용한다

  • 고수준 API에서 제공하지 않는 기능이 필요한 경우. 클러스터의 물리적 데이터 배치를 세밀하게 제어해야 하는 경우
  • RDD로 된 기존 코드를 유지해야 하는 경우
  • accumulator, broadcast와 같은 분산형 공유 변수를 다뤄야 하는 경우

모든 DataFrame/Dataset은 RDD로 컴파일된다. 구조회된 API의 각 레코드는 스키마를 알고 있는 필드로 구성된 반면, RDD의 레코드는 자바, 스칼라, 파이썬 객체일 뿐이다.

따라서 개발자가 강력한 제어권을 가질 수 있다. 그러나 레코드의 내부 구조를 스파크에서 파악할 수 없어 최적화가 불가능하다.

HBase-Spark

hbase-spark 라이브러리에서는 RDD를 사용하면 Scan 객체를 직접 통제할 수 있으므로 원하는 필터를 추가할 수 있다. 스파크 최적화보다 스캔 필터 추가가 성능이 더 좋을수도…

hbase-spark (‘org.apache.hbase:hbase-spark:jar:2.0.0-alpha4’) 코드 들여다봤는데, SparkSQL 을 이용했을때는 HBase에서의 Filter를 최적화하거나 사용하지 않는다. 단, 조건절 푸시다운 등 스파크 최적화는 지원한다.

hbase-spark 이용하면 RDD의 파티셔닝을 리전별로 해준다.

참고

태그:

카테고리:

업데이트:

댓글남기기