Chapter 1 아파치 스파크란
- 아파치 스파크는 통합 컴퓨팅 엔진이고 클러스터 환경에서 데이터를 병렬로 처리하는 라이브러리 집합
아파치 스파크의 철학
- 스파크는 ‘빅데이터 애플리케이션 개발에 필요한 통합 플랫폼을 제공하자’ 라는 핵심 목표를 가지고 있음
- 스파크는 통합이라는 관점을 중시하면서 기능의 범위를 컴퓨팅 엔진으로 제한했고 그 결과 스파크는 저장소 시스템의 데이터를 연산하는 역할만 수행하고 영구 저장소 역할을 수행하지 않음
- 스파크 컴포넌트는 데이터 분석 작업에 필요한 통합 API를 제공하는 통합 엔진 기반의 자체 라이브러리
Chapter 2 스파크 간단히 살펴보기
스파크의 기본 아키텍쳐
- 컴퓨터 클러스터는 여러 컴퓨터의 자원을 모아 하나의 컴퓨터 처럼 사용할 수 있게 함. 클러스터에서 작업을 조율할 수 있는 프레임워크가 필요한데 스파크가 그런 역할
- 스파크는 클러스터의 데이터 처리 작업을 관리하고 조율함
- 스파크가 연산에서 사용할 클러스터는 스파크 standalone 클러스터 매니저, 하둡 YARN, Mesos 같은 클러스터 매니저에서 관리
- 스파크 애플리케이션은 driver와 executor 프로세스로 구성
- driver : main() 함수를 실행, 애플리케이션의 수명 주기 동안 관련 정보를 모두 유지
- executor : 드라이버가 할당한 작업을 실행하고 진행 상황을 드라이버에 보고하는 두가지 역할을 수행
- 하나의 클러스터에서 여러 개의 애플리케이션 실행 할 수 있음
스파크의 다양한 언어 API
- 스파크는 다양한 언어로 스파크 코드를 실행할 수 있음. 구조적 API만으로 작성된 코드는 언어에 상관 없이 유사한 성능을 발휘
- 사용자는 스파크 코드를 실행하기 위해 SparkSession 객체를 진입점으로 사용
- 스파크는 python이나 R로 작성한 코드를 익스큐터의 JVM에서 실행할 수 있는 코드로 변환
스파크 API
- 스파크는 저수준의 unstructured API와 고수준의 structured API를 제공하기 때문에 다양한 언어로 스파크를 사용할 수 있음
SparkSession
- 스파크 애플리케이션은 SparkSession이라 불리는 드라이버 프로세스로 제어
- 하나의 sparksession은 하나의 스파크 애플리케이션에 대응
DataFrame
- 가장 대표적인 구조적 API
- dataframe은 테이블의 데이터를 로우와 컬럼으로 단순하게 표현하고 컬럼과 컬럼의 타입을 정의한 목록을 스키마라 부름
스파크는 Dataset, DataFrame, SQL 테이블, RDD라는 몇가지 핵심 추상화 개념을 갖고 있고, 이 개념 모두 분산 데이터 모음을 표현한다.
파티션
- 스파크는 익스큐터가 별렬로 작업을 수행할 수 있도록 파티션이라 불리는 청크 단위로 데이터를 분할
- 파티션은 클러스터의 물리적 머신에 존재하는 로우의 집합을 의미
- dataframe을 사용하면 파티션을 처리할 필요가없음. 물리적 파티션에 데이터 변환용 함수를 지정하면 스파크가 실체 처리 방법을 결정
트랜스포메이션
- 스파크의 핵심 데이터 구조는 immutable을 가짐.
- dataframe을 변경하려면 원하는 변경 방법을 스파크에게 알려야하는데 이때 사용하는 명령을 프랜스포메이션이라 부름
- 트랜스포메이션을 수행하기 위해서는 액션을 호출해야함
- 트랜스포메이션은 narrow dependency, wide dependency라는 두 가지 유형을 가짐
- 좁은 트랜스포메이션 : 각 입력 파티션이 하나의 출력 파티션에만 영향을 미침
- 넓은 트랜스포메이션(셔플) : 하나의 입력 파티션이 여러 출력 파티션에 영향을 미침
지연연산(lazy evaluation)
- 스파크가 연산 그래프를 처리하기 직전까지 기다리는 동작 방식
- 스파크는 명령이 내려시면 트랜스포메이션의 실행 계획을 생헝하고 마지막 순간짜디 대기하다가 원형 dataframe 트랜스포메이션을 간결한 물리적 실행 계획으로 컴파일함
액션
- 액션은 트랜스포메이션으로 부터 결과를 계산하도록 지시하는 명령
- 액션을 시정하면 스파크 job이 시작됨
Chapter 3 스파크 기능 둘러보기
운영용 애플리케이션 실행하기
- spark-sibmit 명령은 애플리케이션 코드를 클러스터에 전송해 실행시키는 역할
- 스파크 애플리케이션은 스탠드얼론, 메소스, yarn 클러스터 매니저를 이용해 실행됨
Dataset: 타입 안정성을 제공하는 구조적 API
- dataset은 자바와 스칼라의 정적 데이터 타입에 맞는 정적 타입 코드(statically typed code)를 지원하기 위해 고안된 스파크의 구조적 API, 동적 타입 언어인 python과 R에서는 사용할 수 없음
- dataset API는 Dataframe의 레코드를 사용자가 자바나 스칼라로 정의한 클래스에 할당하고 자바의 ArrayList 또는 스칼라의 Seq 객체 등의 고정 타입형 컬렉션으로 다룰 수 있는 기능을 제공
- 타입 안정성을 지원하기 때문에 초기화에 사용한 클래스 대신 다른 클래스를 사용해 접근할 수 없음
구조적 스트리밍
- 구조적 스트리밍은 스파크 2.2 버전에서 안정화된 스트림 처리용 고수준 API
- 구조적 스트리밍을 사용하면 구조적 API로 개발된 배치 모드 연산을 스트리밍 방식으로 실행할 수 있고, 지연 시간을 줄이고 증분 처리할 수 있음
- 구조적 스트리밍은 배치 처리용 코드를 일부 수정하여 스트리밍 처리를 수행하고 값을 빠르게 얻을 수 있다는 장점을 갖음
셔플 파티션 수는 셔플 이후에 생성될 파티션 수를 의미
저수준 API
- 스파크의 모든 기능은 RDD를 기반으로 만들어져있음
- 원시 데이터를 읽거나 다루는 용도로 RDD를 사용할 수 있지만 대부분은 구조적 API를 사용하는 것이 좋음
- RDD는 파티션과 같은 물리적 실행 특성을 결정할 수 있으므로 DataFrame보다 더 세밀한 제어가 가능
- 드라이버 시스템의 메모리에 저장된 원시 데이터를 병렬처리 하는데 RDD를 사용할 수 있음
- 언어와 관계없이 동일한 실행 특성을 제공하는 DataFrame API와 달리 RDD는 구현 방식에서 차이가 있음