본문 바로가기

데이터처리/spark

구조적 API

구조적 API는 데이터 흐름을 정의하는 기본 추상화 개념

다양한 유형의 데이터를 처리 할 수 있다.

 

  •  비정형적인 로그 파일 
  •  반 정형적인 CSV 파일
  •  정형적인 파케이 파일

 

구조적 API 의 종류

  • Dataset
  • DataFrame
  • SQL 테이블과 뷰

 

DataFrame 과 Dateset

DataFrame 과 Dataset 은 잘 정의된 로우와 컬럼을 가지는 분산 테이블 형태의 컬렉션이다

지연 연산의 실행 계획이며, 불변성을 가진다.

 

DataFrame에 액션을 호출하면 스파크는 트랜스포메이션을 실행하고 결과를 반환한다.

 

DataFrame 은 '비타입형' 이고 Dataset 은 '타입형' 이다.

정확히는 DataFrame 은 타입 일치 여부를 런타임 이 되어서야 확인 할 수 있다.

Dataset 은 컴파일 단계에서 확인 할 수 있다.

Dataset 은 JVM 기반의 스칼라와 자바만 허용해준다.

 

DataFrame 을 사용하면 스파크의 최적화된 내부 포멧을 사용할 수 있다.

 

컴파일 단계에서 엄격한 검증이 필요한 경우엔 Dataset을 사용하자.

 

 

스키마

스키마는 분산 컬렉션에 저장할 데이터 타입을 정의하는 방법

DataFrame 의 컬럼명과 데이터 타입을 정의한다.

 

 

구조적 API 의 실행 과정

 

스파크가 클러스터에서 실제 처리되는 과정을 알아보자

구조적 API 쿼리가 사용자 코드에서 실제 실행 코드로 변환되는 과정을 알아보자

 

1. DatraFrame, Dataset, SQL 로 코드를 작성한다.

2. 스파크가 논리적 실행 계획으로 변환

3. 스파크는 논리적 실행 계획을 물리적 실행 계획으로 변환, 이 과정에서 최적화 할 수 있는지 확인

4. 스파크는 클러스터에서 물리적 실행 계획(RDD 처리)을 실행한다.

 

작성한 스파크 코느는 콘솔이나 spark-submit 을 통해 실행한다.

카탈리스트 엔진의 옵티마이저는 코드를 받고 실행 계획을 생성한다.

스파크는 코드를 받고 실행한 후 결과를 반환한다.

 

 

- 논리적 실행 계획

사용자 코드를 논리적 실행계획으로 변환한다.

논리적 실행 계획 단계에서는 추상적 트랜스포메이션만 표현한다.

이 단계에서는 드라이버나 익스큐터의 정보를 고려하지 않는다.

 

사용자의 코드를 다양한 최적화 버전으로 변환한다.

이 과정으로 첫번째 검증 전 논리적 실행 계획 으로 변환한다.

코드의 유효성과 테이블이나 컬럼의 존재 여부만 판단 하는 과정으로 실행 계획을 검증하지 않은 상태다.

 

스파크 분석기는 컬럼과 테이블을 검증하기 위해 

카탈로그를 활용한다.

카탈로그에서 검증을 한 후 검증된 논리적 실행 계획이 나온다.

테이블과 컬럼에 대한 카탈로그의 검증 결과는 카탈리스트 옵티마이저로 전달한다.

 

옵티마이저는 논리적 실행 계획을 최적화시켜

최적화된 논리적 실행 계획을 만들어 낸다.

 

 

- 물리적 실행 계획

물리적 실행계획은 스파크 실행 계획이라고도 불린다.

논리적 실행 계획을 클러스터 환경에서 실행하는 방법을 정의한다.

 

논리적 실행계획을 다양한 물리적 실행 전략을 생성하고

비용모델을 이용해 비교 한 후 

최적의 물리적 실행 계획을 선택한다.

 

비용모델은 예를 들면 테이블의 크기나 파티션 수 등의 물리적 속성을 고려해

지정된 조인 연산 수행에 필요한 비용을 계산 하고 비교하는 행동을 한다.

 

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

 

스파크는 DataFrame, Dataset, SQL 로 정의된 쿼리를 RDD 트랜스포메이션으로 컴파일 한다.