Spark의 핵심 구성요소와 동작 원리를 이해합니다. 이 섹션에서는 Spark가 내부적으로 어떻게 동작하는지, 그리고 효율적인 분산 처리를 위해 알아야 할 개념들을 다룹니다.
전체 비유 테이블#
Spark의 핵심 개념을 일상적인 비유로 이해하세요. 복잡한 분산 시스템도 익숙한 상황에 빗대면 쉽게 파악할 수 있습니다.
| 개념 | 비유 | 핵심 아이디어 |
|---|---|---|
| Driver | 오케스트라 지휘자 | 전체 연주를 조율하지만 직접 악기를 연주하지 않음. 악보(실행 계획)를 보고 단원(Executor)에게 지시 |
| Executor | 오케스트라 단원 | 각자 맡은 파트를 연주. 지휘자의 지시에 따라 실제 음악(데이터 처리)을 생성 |
| Cluster Manager | 공연장 매니저 | 연주자에게 의자(리소스)를 배정. 공연장(YARN, K8s) 규칙에 따라 자원 관리 |
| RDD | 레고 블록 조립 설명서 | 블록을 어떻게 조립하는지 기록. 완성품이 아니라 만드는 방법을 저장. 중간에 무너져도 설명서대로 다시 조립 가능 |
| DataFrame | 엑셀 스프레드시트 | 행과 열이 있는 표 형태. 컬럼명으로 데이터 접근, SQL처럼 쿼리 가능 |
| Transformation | 요리 레시피 | “양파 썰기 → 볶기 → 간 맞추기” 같은 조리법. 레시피만 있으면 아직 요리 안 함 |
| Action | “시작!” 신호 | 레시피대로 실제 요리 시작. 완성된 요리(결과)가 나옴 |
| 지연 평가 | 대량 주문 묶음 배송 | 주문(Transformation)마다 배송하지 않고, 결제(Action) 시점에 한꺼번에 최적 경로로 배송 |
| 파티션 | 피자 조각 | 큰 피자를 여러 조각으로 나눠 여러 사람이 동시에 먹을 수 있음. 조각 수 = 동시 처리 수 |
| 셔플 | 카드 섞기 | 52장 카드를 무늬별로 분류하려면 모든 카드를 펼쳐 재배치해야 함. 비용이 큼 |
| Narrow Transformation | 개인 접시에서 작업 | 내 접시의 음식만 손질. 옆 사람 접시 건드릴 필요 없음 |
| Wide Transformation | 모든 접시 음식 재분배 | “고기는 이쪽, 채소는 저쪽"으로 재배치. 모든 테이블 참여 필요 |
| 캐싱 | 자주 쓰는 재료 냉장고 보관 | 매번 장보러 가는 대신 냉장고에서 바로 꺼내 사용. 빠르지만 공간 차지 |
| Broadcast | 회의 자료 복사 배포 | 1부를 돌려보는 대신 참석자 모두에게 복사본 배포. 작은 자료일 때 효율적 |
| DAG | 조립 순서도 | A를 만들고 → B와 결합 → C 완성. 순환 없는 단방향 의존 관계 |
| Catalyst Optimizer | 내비게이션 경로 최적화 | 목적지만 알려주면 가장 빠른 길 자동 계산. 사용자는 “어디로"만 신경 |
| Watermark | 지각 허용 시간 | “10분까지 지각 인정”. 그 후 도착자는 출석 불인정(늦은 데이터 처리) |
Tip: 각 개념 문서에서 이 비유들이 어떻게 기술적으로 구현되는지 상세히 설명합니다.
Spark의 설계 철학#
왜 Spark는 이런 방식으로 설계되었을까요?
Spark의 설계는 세 가지 핵심 원칙을 따릅니다:
데이터 이동 최소화: 데이터를 옮기는 것보다 코드를 옮기는 게 빠릅니다. Spark는 가능한 데이터가 있는 곳에서 계산합니다.
실패는 일상: 수천 대 서버 중 일부는 언제든 고장납니다. RDD의 Lineage(혈통)는 장애 시 손실된 부분만 재계산하는 복구 메커니즘입니다.
늦출 수 있으면 늦춰라: 지연 평가로 전체 연산을 파악한 후 최적화합니다. 조급하게 중간 결과를 만들면 최적화 기회를 잃습니다.
Java/Spring 개발자가 Spark를 배울 때#
Java/Spring 개발자에게 Spark는 익숙하면서도 새로운 패러다임입니다. Stream API와 유사한 함수형 스타일이지만, 분산 환경의 특성으로 인해 다르게 생각해야 하는 부분이 있습니다.
익숙한 점
filter(),map(),groupBy()같은 함수형 API- Java 람다 표현식 활용
- SQL 쿼리 사용 가능
새롭게 이해해야 할 점
- 지연 평가(Lazy Evaluation): 메서드 호출이 즉시 실행되지 않음
- 직렬화 제약: 클로저에서 사용하는 객체가 직렬화 가능해야 함
- 셔플 비용: 데이터 이동은 네트워크 I/O를 동반하므로 비용이 큼
- 불변 데이터: RDD/DataFrame은 수정 불가, 항상 새로운 객체 반환
이러한 차이점을 이해하고 나면, Spark는 대용량 데이터 처리를 위한 강력한 도구가 됩니다. 각 개념 문서에서 Java 코드 예제와 함께 상세히 설명합니다.
학습 순서#
아래 순서대로 학습하면 Spark의 기초부터 운영까지 체계적으로 이해할 수 있습니다.
기초 개념
먼저 Spark의 핵심 구조와 API를 이해합니다:
- 아키텍처 - Driver, Executor, Cluster Manager의 역할과 상호작용
- RDD 기초 - Spark의 기본 추상화, 분산 컬렉션의 개념
- DataFrame과 Dataset - 현대적인 고수준 API
- Spark SQL - SQL로 분산 데이터 처리
- Transformation과 Action - 지연 평가와 실행의 핵심
심화 개념
기초를 이해했다면 성능 최적화와 고급 기능을 학습합니다:
- 파티셔닝과 셔플 - 분산 처리의 핵심, 데이터 분배 전략
- 캐싱과 영속성 - 인메모리 처리 최적화
- Structured Streaming - 실시간 스트림 데이터 처리
- MLlib - 분산 머신러닝
운영 개념
프로덕션 환경에서 Spark를 운영하기 위한 지식입니다:
- 성능 튜닝 - 메모리, 파티션, 셔플 최적화
- 배포와 클러스터 관리 - Standalone, YARN, Kubernetes 환경
- Spark Connect - 씬 클라이언트 아키텍처 (Spark 3.4+)
핵심 개념 요약#
Spark를 이해하는 데 필수적인 개념들을 간략히 소개합니다. 각 개념의 상세 내용은 개별 문서에서 다룹니다.
실행 모델
Spark 애플리케이션이 어떻게 실행되는지 이해하기 위한 핵심 구성요소입니다:
| 개념 | 설명 |
|---|---|
| Driver | 애플리케이션의 main() 실행, 작업 조율 |
| Executor | 실제 데이터 처리를 수행하는 워커 프로세스 |
| Cluster Manager | 리소스 할당 (Standalone, YARN, K8s) |
| Job | 하나의 Action에 대응하는 작업 단위 |
| Stage | 셔플 경계로 나뉜 Task 집합 |
| Task | 단일 파티션에서 실행되는 최소 작업 단위 |
Driver는 전체 작업을 조율하고, 실제 데이터 처리는 여러 Executor에서 병렬로 수행됩니다.
데이터 추상화
Spark가 제공하는 세 가지 데이터 API의 특성 비교입니다:
| API | 타입 안전성 | 최적화 | 사용 시점 |
|---|---|---|---|
| RDD | 있음 (제네릭) | 제한적 | 저수준 제어 필요 시 |
| DataFrame | 없음 (Row) | Catalyst 최적화 | SQL 스타일 처리 |
| Dataset | 있음 (case class) | Catalyst 최적화 | 타입 안전 + 최적화 |
대부분의 경우 DataFrame을 사용하고, 컴파일 타임 타입 체크가 필요할 때 Dataset을 선택합니다.
연산 유형
Spark 연산은 크게 Transformation과 Action으로 구분됩니다:
| 유형 | 특성 | 예시 |
|---|---|---|
| Transformation | 지연 평가, 새 RDD/DataFrame 반환 | map, filter, groupBy |
| Action | 즉시 실행, 값 반환 | collect, count, show |
Transformation은 호출 즉시 실행되지 않고, Action이 호출될 때 최적화된 실행 계획으로 처리됩니다.
Narrow vs Wide Transformation
Transformation은 셔플 발생 여부에 따라 두 가지로 구분됩니다:
| 유형 | 셔플 | 예시 |
|---|---|---|
| Narrow | 없음 (1:1 파티션 매핑) | map, filter, union |
| Wide | 있음 (셔플 발생) | groupBy, join, reduceByKey |
Wide Transformation은 네트워크 I/O를 발생시키므로 성능에 큰 영향을 미칩니다. 이러한 개념들이 어떻게 연결되는지 각 문서에서 상세히 다룹니다.