4. 구조적 API 개요
- 구조적 API는 데이터 흐름을 정의하는 기본 추상화 개념
- 구조적 API는 비정형 로그파일, 반정형 CSV, 정형 Parquet파일까지 다양한 유형의 데이터를 처리할 수 있음
- 구조적 API는 Dataset, DataFrame, SQL 테이블과 뷰와 같은 세가지 분산 컬렉션 API가 있다.
- 배치와 스트리밍 처리에서 구조적 API를 사용할 수 있음
- 구조적 API를 활용하면 배치 작업을 스트리밍 작업으로 변환할 수 있음(반대도 마찬가지)
스파크의 기본개념
- 스파크는 트랜스 포메이션의 처리 과정을 정의하는 분산 프로그래밍 모델이다.
- 다수의 트랜스포메이션은 DAG로 표현되는 명령을 만들어냄
- 액션은 잡을 실행하기위해 스테이지와 테스크로 나누고 DAG처리 프로세스를 실행
DataFrame과 Dataset
- 열과 행으로 이루어진 분산 테이블 형태의 컬렉션
- 행은 정수형이나 문자열과 같은 단순 데이터 타입, 배열이나 맵 같은 복합 데이터 타입, null값으로 표현됨
- 열은 데이터 레코드이며 SQL, RDD, 데이터소스에서 얻거나 직접 만들수 있다.
- 각 컬럼은 동일한 수의 열을 가져야하며 컬렉션의 모든 로우는 동일한 데이터 타입 정보를 가져야함
- DF와 Dataset은 지연 연산의 실행계획이며 불변성을 가진다.
- 액션을 호출하면 트랜스포메이션은 실제로 실행되고 결과를 반환
- 스키마는 분산 컬렉션을 저장할 데이터 타입을 정의하는 방법
- 스카마는 컬럼명과 데이터 타입을 정의하며 데이터 소스에서 얻거나(schema-on-read) 직접정의할 수 있음
스파크의 구조적 데이터 타입
- 스파크는 실행 계획 수립과 처리에 사용하는 자체 데이터 타입 정보를 가지고 있는 Catalyst 엔진을 사용한다.
- Catalyst 엔진은 다양한 실행 최적화 기능을 제공한다.
- 조건절 푸시 다운이나 선택절 구문을 이용해 논리적 실행 계획을 최적화하는 규칙의 모음
- 필요한 경우 도메인에 최적화된 규칙을 적용할 수 있는 카탈리스트 옵티마이저의 확장형 패키지를 만들 수도 있음
- 스파크는 자체 데이터 타입을 지원하는 여러 언어 API와 직접 매핑되며, 각 언어에 대한 매핑 테이블을 가지고 있다.
- 즉, 파이썬이나 R을 이용해 스파크의 구조적 API를 이용하더라도 Catalyst 엔진에 의해 스파크의 데이터타입으로 변환되어 연산이 수행된다.
DataFrame과 Dataset의 비교
- DF(비타입형) - Dataset(타입형)
- DF는 스키마에 명시된 데이터 타입의 일치여부를 런타임에 확인한다.
- Dataset은 데이터 타입의 일치 여부를 컴파일 타임에 확인한다.
- 언어
- Dataset은 JVM 기반의 언어인 스칼라, 자바에서만 지원한다,
- Dataset의 데이터 타입을 정의하려면 Scala(case class)나 Java(JavaBean)을 사용해야함
- DataFrame은 Dataset의 한 종류이다.
- DF는 Row타입으로 구성된 Dataset이다.
- Row 타입은 연산에 최적화된 인메모리 포맷의 내부적인 표현 방식
- Row 타입을 사용하면 가비지 컬렉션과 객체 초기화 부하가 있는 JVM 데이터 타입을 사용하는 대신 자체 데이터 포맷을 사용하기 때문에 매우 효율적인 연산이 가능
- 중요한 점은 DataFrame을 사용하면 스파크의 최적화된 내부 포맷을 사용할 수 있다는 점
구조적 API의 실행과정
전체적인 과정
- DataFrame/Dataset/SQL을 이용해 코드를 작성
- 유효한 코드라면 논리적 실행계획으로 변환
- 논리적 실행계획을 물리적 실행계획으로 변환, 그 과정속에서 최적화를 할 수 있는지 확인
- 스파크 클러스터에서 물리적 실행계획(RDD 처리)은 실행
논리적 실행 계획
- 추상적인 트랜스포메이션만 표현
- 드라이버나 익스큐터의 정보를 고려하지 않음
- 코드의 유효성과 테이블이나 컬럼의 존재 여부를 판단하여 unresolved logic plan으로 변환
- 스파크 analyzer는 컬럼과 테이벌을 검증하기 위해 카탈로그, 모든 테이블의 저장소 그리고 DF 정보를 활용해 resolved logic plan으로 변환
- resolved logic plan은 카탈리스트 옵티마이저에게 전달되어 최적화된 논리적 실행계획을 생성
물리적 실행 계획
- 논리적 실행계획을 클러스터에서 실행하는 방법을 정의한 것이다.
- 최적화된 논리적 실행 계획을 통해 다양한 물리적 실행 전략을 생성
- 비용 모델을 이용해서 비교후 최적의 전략을 선택
- DataFrame, Dataset, SQL로 정의된 물리적 실행 계획을 RDD 트랜스포메이션으로 컴파일 (스파크를 컴파일러라고 부르기도함)
- 스파크는 런타임에 task나 stage를 제거할 수 있는 자바 바이트 코드를 생성해 추가적은 최적화를 수행하고 처리결과를 사용자에게 반환
parquet : https://devidea.tistory.com/92