-
[스파크 완벽 가이드 읽기]PART1. 빅데이터와 스파크 간단히 살펴보기기술 도서 읽기 2023. 12. 24. 00:39
안녕하세요 둔:둔입니다.
요즘 스파크를 따로 공부하려고 '스파크 완벽 가이드(Spark The definitive Guide)'를 읽고 있는데요. 오늘은 책의 PART1 부분 내용을 좀 정리해보고자 합니다.
(아주 약간의 제 코멘트를 버무린)앞으로도 종종 파트 단위 혹은 챕터 단위로 스파크 완벽 가이드를 읽으면서 글을 올리려고 해요! 목표는 완독..ㅋㅋㅋㅋ참고로, 제가 읽고 있는 스파크 완벽 가이드는 스파크 2.0 버전을 기반으로 하고 있습니다. 현재 최신 버전은 3.x 대 버전으로 중간중간 공식 문서 내용을 함께 확인해야 할 듯합니다:)
스파크 완벽 가이드 : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com
CHAPTER1. 아파치 스파크란
아파치 스파크는 통합 컴퓨팅 엔진이며 클러스터 환경에서 데이터를 병렬로 처리하는 라이브러리 집합입니다. 4가지 언어(파이썬, 자바, 스칼라, R)를 지원하며 SQL, 스트리밍, 머신러닝에 이르기까지 넓은 범위의 라이브러리를 제공합니다. 단일 노트북 환경부터 수천 대 서버로 구성된 클러스터까지 다양한 환경에서 실행 가능하기에 빅데이터 처리를 쉽게 시작가능 + 큰 규모의 클러스터로 확장해 나갈 수 있다는 장점이 있습니다.
스파크에서 제공하는 컴포넌트와 라이브러리구성은 아래 사진을 참고로 해주시면 좋습니다(어디선가 많이 보던 이미지죠..?ㅎㅎ)
저수준 API 위에 구조적 API, 그 위에 구조적 스트리밍 - 고급 분석 - 라이브러리 및 에코시스템으로 구성되어 있습니다.
스파크 기능 구성 아파치 스파크의 철학
빅데이터 애플리케이션 개발에 필요한 통합 플랫폼을 제공하자 ⏩ 빅데이터를 위한 통합 컴퓨팅 엔진과 라이브러리 집합
통합(unified)의 의미
스파크는 간단한 데이터 읽기, SQL 처리, 머신러닝, 스트리밍 처리까지 다양한 데이터 분석 작업을 같은 연산 엔진과 일관성 있는 API로 수행할 수 있도록 설계되어 있습니다. 아파치 스파크 이전에는 사용자가 다양한 API와 시스템을 직접 조합해서 애플리케이션을 작성해야 했으나, 스파크가 통합 엔진을 제공하며 이러한 불편함을 해결할 수 있게 되었습니다. 예시로 SQL 쿼리로 데이터를 읽고 ML 라이브러리로 머신러닝 모델을 평가해야 하는 경우 스파크 엔진은 이 두 단계를 하나로 병합하고 데이터를 한 번만 조회할 수 있는 환경을 제공해 줍니다.
컴퓨팅 엔진
스파크는 통합 관점 중시하며 기능의 범위는 컴퓨팅 엔진으로 제한해 왔습니다. 저장소 시스템의 데이터를 연산하는 역할만 수행, 영구 저장소 역할은 수행하지 않습니다. 대안으로 클라우드 기반의 애저 스토리지(Azure Storage), 아마존 S3(Amazon S3), 분산 파일 시스템 아파치 하둡(Apache Hadoop), Key-Value 저장소 아파치 카산드라(Apache Cassandra), 메시지 전달 서비스 아파치 카프카(Apache Kafka) 등의 저장소를 지원합니다. 대부분 데이터가 항상 하나의 데이터 이외 여러 저장소에 혼재되어 저장되어 있는 경우가 많기 때문에 데이터 이동 자체에 비용이 발생한 다는 점을 고려했을 때, 스파크는 데이터 저장 위치에 상관없이 처리에 집중하도록 만들어졌습니다.
라이브러리
표준 라이브러리와 오픈소스 커뮤니티에서 서드파티 패키지 형태로 제공하는 다양한 외부 라이브러리, 다양한 저장소 시스템을 위한 커넥터 등을 지원합니다. 외부 라이브러리 목록은 spark-packages.org에서 확인 가능!
Spark Packages
spark-packages.org
스파크의 등장배경과 역사
더보기데이터 수집 비용은 극히 저렴해졌으나, 데이터 거대화에 따른 문제 해결을 위해 탄생
UC버클리 대학교에서 2009년 스파크 연구 프로젝트로 시작 - Spark: cluster Computing with Working Sets 논문을 통해 세상에 알려졌습니다. 스파크의 첫 번째 버전은 배치 애플리케이션만 지원했으나, 곧 대화형 데이터 분석이나 비정형 쿼리(ad-hoc query) 기능을 제공하기 시작했으며, 2011년에는 대화형으로 SQL을 실행할 수 있는 엔진인 샤크(Shark)를 빠르게 개발 및 공개했습니다. 이후 2014년에 스파크 1.0 버전, 2016년에 스파크 2.0 버전을 공개하고 계속 새로운 기능이 추가된 스파크를 발표하고 있습니다.(현재는 3.x 버전!)
스파크 1.0 이전 함수형 연산(자바 객체로 이루어진 컬렉션에 맵이나 리듀스 같은 병렬 연산을 수행하는 방식)
스파크 1.0 이후 구조화된 데이터 기반으로 동작하는 신규 API 스파크 SQL 추가
이후 계속해서 DataFrame, 머신러닝 파이프라인, 자동 최적화를 수행하는 구조적 스트리밍 등 구조체 기반의 신규 API 추가CHAPTER2. 스파크 간단히 살펴보기
스파크의 기본 아키텍처
사용자가 클러스터 매니저에 스파크 애플리케이션을 제출 ⏩ 클러스터 매니저는 애플리케이션 실행에 필요한 자원을 할당 ⏩ 할당받은 자원으로 작업을 처리
클러스터: 여러 컴퓨터의 자원을 모아 하나의 컴퓨터처럼 사용할 수 있게 만든 일종의 그룹
스파크는 클러스터의 데이터 처리 작업을 관리하고 조율하는 프레임워크이며, 연산에 사용할 클러스터는 클러스터 매니저에서 관리합니다.
<스파크 클러스터를 관리하는 클러스터 매니저>
스탠드얼론(standalone) 클러스터 매니저
하둡 YARN
메소스(Mesos)스파크 애플리케이션
스파크 애플리케이션은 드라이버 프로세스와 여러 개의 익스큐터 프로세스로 구성됩니다. *익스큐터는 대부분 스파크 코드를 실행하는 역할, 드라이버는 스파크의 언어 API를 통해 다양한 언어로 실행 가능
- 드라이버(driver): 클러스터나 노드 중 하나에서 main() 함수 실행 ⏩ 스파크 애플리케이션 정보의 유지 관리, 사용자 프로그램 및 입력에 대한 응답, 익스큐터 프로세스의 작업 관련 분석, 배포, 스케줄링 역할을 수행
- 익스큐터(executor): 드라이버 프로세스가 할당한 작업을 수행 ⏩ 코드 진행 + 진행 상황을 드라이버 노드에 보고하는 역할 수행
스파크 애플리케이션의 아키텍처 스파크의 언어
- 스칼라: 스파크의 개발 언어이자 기본 언어
- 자바
- 파이썬: 스칼라가 지원하는 대부분의 구조를 지원
- SQL: ANSI SQL 표준 중 일부를 지원
- R: SparkR(스파크 코어 포함) / sparklyr(R 커뮤니티 기반 패키지)
SparkSession
스파크 애플리케이션을 제어하는 드라이버 프로세스. 하나의 SparkSession은 하나의 스파크 애플리케이션에 대응합니다.
DataFrame
- 대표적인 구조적 API로 테이블 데이터 로우-컬럼 형태로 표현됩니다.
- 스키마(schema): 컬럼과 컬럼 타입을 정의한 목록입니다.
- 분산 데이터 모음
- 파티션: 익스큐터가 병렬로 작업을 수행할 수 있도록 하는 청크 단위로 클러스터의 물리적 머신에 존재하는 로우의 집합을 의미함
- 1개의 파티션 - 수천 개의 익스큐터 ⏩ 병렬성은 1 / 수백 개의 파티션 - 1개의 익스큐터 ⏩ 병렬성은 1
트랜스포메이션
- 스파크의 핵심 데이터 구조는 불변성(한번 생성하면 변경 불가)
- DataFrame을 변경하기 위해 변경 방법을 스파크에 알려주는 것 = 트랜스포메이션
- 좁은 의존성(narrow dependency): 각 입력 파티션이 하나의 출력 파티션에만 영향(ex.where 구문 사용) / 스파크에서 자동으로 파이프라이닝(pipelining)
- 넓은 의존성(wide dependency): 하나의 입력 파티션이 여러 출력 파티션에 영향
- 셔플(shuffle): 클러스터에서 파티션을 교환하는 행위 / 셔플의 결과는 디스크에 저장
*(참고표현) 셔플 파티션 수 = 셔플 이후에 생성될 파티션 수 - DataFrame에 여러 필터 지정 -> 메모리 작업
- 지연 연산(lazy evaluation): 스파크가 연산 그래프를 처리하기 직전까지 기다리는 동작 방식
- 액션(action): 트랜스포메이션으로부터 결과를 계산하도록 지시하는 명령
- 스파크 UI: 모니터링하기에 편안!
코드 예제
divisBy2 = myRange.where("number % 2 = 0")
이 경우 결과 출력은 x(추상적인 트랜스포메이션만 지정한 상태로 액션(action) 호출 없이는 실제 수행 x)
CHAPTER3. 스파크 기능 둘러보기
- spark-submit
- 애플리케이션 코드를 클러스터에 전송해 실행시키는 역할
- 어플리케이션 실행에 필요한 자원과 실행 방식 및 여러 옵션 지정 가능
- Dataset
- 정적 타입 코드를 지원하기 위한 구조적 API
- 타입 안정성 지원 <- 동적 타입 언어인 파이썬과 R에서는 사용 불가
- 구조적 스트리밍: 스파크 2.2 버전에서 안정화된 스트림 처리용 고수준 API
- 머신러닝과 고급 분석: MLlib
- 저수준 API: RDD
- 원시 데이터를 읽거나 다루는 용도 -> 대체적으로 구조적 API 사용이 좋음
- 파티션 등 물리적 실행 특성을 결정할 수 있어 세밀한 제어 가능
- 드라이버 시스템 메모리에 저장된 원시 데이터 병렬처리
- 낮은 버전의 스파크 사용이 아니라면 RDD를 이용한 스파크 코드를 작성할 필요는 굳이 없음! 다만 비정형 데이터 및 정제되지 않은 원시 데이터 처리 시에는 RDD 사용해야 할 수도 있음
- SparkR: 스파크를 R 언어로 사용하기 위한 기능
🧸 후기
챕터 하나는 너무 적건 깊어져야 할 것 같고 PART 단위 괜찮다 생각했는데 기본적으로 말과 글이 긴 사람이어서 정리가 쉽지 않네요...'기술 도서 읽기' 카테고리의 다른 글
[책 읽기]그림으로 이해하는 가상화와 컨테이너 #1. 가상화 기초지식 (1) 2025.03.16 [스파크 완벽 가이드 읽기]구조적API 개요 (0) 2024.02.18