.
구조적 API
구조적 API에는 3가지의 분산 컬렉션 API가 존재
- Dataset
- DataFrame
- SQL 테이블과 뷰
배치와 스트리밍 처리에 구조적 API 사용 가능.
→ 구조적 API를 활용한다면 배치 작업을 스트리밍 작업으로 변환 가능.
- 구조적 API는 데이터 흐름을 정의하는 기본 추상화 개념.
- 타입형/비타입형 API의 개념과 차이점
- 핵심 용어
- 스파크가 구조적 API의 데이터 흐름을 해석하고 클러스터에서 실행하는 방식
4.1 DataFrame, Dataset
- 잘 정의된 row, column을 가지는 분산 테이블 형태의 컬렉션
- 결과를 생성하기 위해 어떤 데이터에 어떤 연산을 적용해야하는지 정의하는 지연 연산의 실행계획
- 불변성을 가짐
4.2 스키마
- DataFrame의 컬럼명과 데이터 타입을 정의
- schema-on-read 혹은 직접 정의
4.3 스파크의 구조적 데이터 타입 개요
- 스파크 카탈리스트 엔진 → 실행 최적화 기능
1 |
|
- 스파크는 사실상 프로그래밍 언어
4.3.1 DataFrame, Dataset 비교
- DataFrame → 비타입형
- 스키마에 명시된 데이터 타입의 일치여부를 런타임에 확인
- Row타입으로 구성된 Dataset
- Row 타입은 스파크가 사용하는 연산에 최적화된 인메모리 포맷
- JVM 데이터 타입은 GC와 객체 초기화 부하가 있지만, Row타입은 이런 점에서 자유로움
- DataFrame을 사용하면 스파크의 최적화된 내부 포맷을 사용할 수 있음.
- Dataset → 타입형
- 스키마에 명시된 데이터 타입의 일치여부를 컴파일 타임에 확인
- JVM 기반의 scala, java에서만 지원 (scala: case class)
- 스키마에 명시된 데이터 타입의 일치여부를 컴파일 타임에 확인
4.3.2 컬럼
- 정수형이나 문자열 → 단순 데이터 타입
- 배열, 맵 → 복합 데이터 타입
- null
4.3.3 row
- 데이터 레코드
- DataFrame의 레코드는 Row타입으로 구성
1 |
|
4.3.4 스파크 데이터 타입
1 |
|
4.4 구조적 API의 실행 과정
- DataFrame/Dataset/SQL을 이용해 코드를 작성
- 정상적인 코드라면 스파크가 논리적 실행 계획으로 변환
- 스파크는 논리적 실행 계획을 물리적 실행 계획으로 변환 → 추가적인 최적화가 가능한지 확인
- 클러스터에서 물리적 실행 계획 (RDD 처리)을 실행
4.4.1 논리적 실행 계획
- 사용자 코드 → unresolved logical plan
- 코도의 유효성과 테이블이나 컬럼의 존재 여부만을 판단
- Analyzer는 컬럼과 테이블을 검증하기 위해 카탈로그, 모든 테이블의 저장소, DataFrame정보를 활용
4.4.2 물리적 실행 계획
- 스파크 실행 계획 = 물리적 실행 계획
- 논리적 실행계획을 클러스터 환경에서 실행하는 방법을 정의
- 다양한 물리적 실행 전략을 생성 → 비용모델을 이용해서 비교 → 전략 선택
- 물리적 실행 계획 → 일련의 RDD와 트랜스포메이션으로 변환
- 스파크는 DataFrame, Dataset, SQL로 정의된 쿼리를 RDD 트랜스포메이션으로 컴파일해서 스파크를 컴파일러라고 부르기도 함.
4.4.3 실행
- 스파크는 물리적 실행 계획을 선정한 다음 RDD(저수준 프로그래밍 인터페이스)를 대상으로 모든 코드를 실행
- 스파크는 런타임에 전체 테스크나 스테이지를 제거할 수 잇는 자바 바이트 코드를 생성해 추가적인 최적화 수행.
.
4부에서 계속