
[ "스파크 완벽 가이드" ] 공부한 후 정리한 내용 입니다
1. 아파치 스파크란?
- 클러스터 환경에서 데이터를 병렬 처리하는 엔진
[ 특징 ]
다양한 언어 지원 → Python / Java / Scala / R
SQL, 스트리밍, 머신러닝까지 하나로 처리 가능 ( DAG 기반 실행 계획 )
빠른 속도 ( 메모리 기반 처리 )
1) 스파크의 철학
모든 데이터 처리를 하나의 엔진에서 통합하자
1.1 통합의 의미?
기존에는
SQL, 머신러닝, 스트리밍 → 각각 다른 시스템 사용
[ 예시 ]
기존 방식
> SQL 데이터 읽기 → 머신러닝 모델 평가 ( 여러 시스템 + 데이터 여러 번 읽음 )
Spark
> 하나의 실행 계획으로 합침
> 데이터 1번만 읽음 → 성능 ↑
- Spark : 하나의 엔진 + 하나의 API로 전부 처리
- 핵심 포인트
- API 통합
- 엔진 통합
- 최적화 자동 수행
2) 컴퓨팅 엔진 관점
- 스파크는 연산만 담당
- 데이터 저장 X
- 계산 처리 O
[ 저장은 누가? ]
HDFS, S3, DB 등
→ 스파크는 가져와서 계산만 함
2.1 Spark vs MapReduce
| 구분 | Spark | MapReduce |
| 역할 | 범용 연산 엔진 (배치 + 스트리밍 + ML) | 배치 처리 전용 |
| 처리 방식 | 메모리 기반 | 디스크 기반 |
| 실행 구조 | DAG 기반 (한 번에 최적화) | Map → Shuffle → Reduce 단계 고정 |
| 성능 | 빠름 (중간 결과 메모리 유지) | 느림 (매 단계 디스크 I/O 발생) |
| 반복 연산 | 강함 (캐싱 가능) | 약함 (매번 디스크 재읽기) |
| 결합도 | 낮음 (HDFS, S3 등 다양하게 사용) | 높음 (HDFS + YARN에 강하게 의존) |
| 유연성 | 높음 (SQL, MLlib, Streaming) | 낮음 (단순 배치 처리 중심) |
- MR는 디스크 기반 단계형 처리로 안정적이고 디버깅이 쉽지만, I/O 비용 때문에 느립니다,
- Spark는 메모리 기반 & DAG 처리로 빠르고 유연하지만, 메모리 비용과 디버깅 난이도가 있습니다.
3) 라이브러리 ( 스파크 생태계 )
- 기본 라이브러리
- Spark SQL → SQL 처리
- MLlib → 머신러닝
- Structured Streaming → 실시간 처리
- GraphX → 그래프 분석
4) 등장 배경
- 기존 맵리듀스 문제
- 반복 작업 비효율 → 매번 디스크 쓰기/읽기
- 스파크 해결 철학
- 메모리 기반 처리 + 중간 데이터 재사용
[ 발전 과정 ]
Spark 1.x → 기본 엔진
Spark SQL 추가
DataFrame / ML Pipeline
Structured Streaming
스파크는 오픈 소스 기반으로 계속 확장 중 → 다양한 데이터 처리 영역 커버
5) Spark 설치 및 설정 ( 하둡 환경 )
실행 환경 JVM 기반 → Java 환경 필요
5.1 Spark 다운로드
FVBros/Spark-The-Definitive-Guide: 한빛미디어에서 출간한 스파크 완벽 가이드 1판의 소스코드 저장소
GitHub - FVBros/Spark-The-Definitive-Guide: 한빛미디어에서 출간한 스파크 완벽 가이드 1판의 소스코드 저
한빛미디어에서 출간한 스파크 완벽 가이드 1판의 소스코드 저장소. Contribute to FVBros/Spark-The-Definitive-Guide development by creating an account on GitHub.
github.com
- 공식 사이트에서 하둡 버전과 호환성 확인 ( 중요 )
현재 하둡 버전은 3.2.4 → Spark 3.4.3 설치
sy0218/Ansible-Multi-Server-Setup: Ansible을 활용해 멱등성을 보장하는 멀티 서버 환경 구축 자동화 및 표준화 프로젝트
GitHub - sy0218/Ansible-Multi-Server-Setup: Ansible을 활용해 멱등성을 보장하는 멀티 서버 환경 구축 자동화
Ansible을 활용해 멱등성을 보장하는 멀티 서버 환경 구축 자동화 및 표준화 프로젝트. Contribute to sy0218/Ansible-Multi-Server-Setup development by creating an account on GitHub.
github.com
- Ansible을 사용한 클러스터 일괄 배포
5.2 Spark 환경 설정
[ Spark-env.sh ]
- 스파크 환경 변수 설정 → 스파크가 어디랑 연결되는지 알려주는 파일
- 스파크가 하둡 설정을 읽어야 클러스터 연결 가능
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export HADOOP_CONF_DIR=/application/hadoop/etc/hadoop
export SPARK_LOG_DIR=/application/spark/logs
[ Spark-defaults.conf ]
- 실행 옵션 설정 → 스파크 실행할 때 기본값 설정
## 기본 실행 설정 ##
spark.master yarn
spark.submit.deployMode client
yarn → 클러스터에서 실행
client → 드라이버는 내 서버에서 실행
-------------------------------------------
## 리소스 설정 ##
spark.driver.memory 4g
spark.executor.memory 4g
spark.executor.cores 2
spark.executor.instances 3
driver → 전체 작업 관리
executor → 실제 작업 수행
memory → 메모리 크기
cores → CPU 코어 갯수
instances → executor 개수 ( 병렬 처리 개수 )
-------------------------------------------
## HDFS 연결 설정 ##
spark.hadoop.fs.defaultFS hdfs://job-cluster
기본 파일 시스템 → HDFS
-------------------------------------------
## Yarn HA 설정 ##
spark.hadoop.yarn.resourcemanager.ha.enabled true
리소스 매니저 이중화 정보 → 리소스 매니저 자동 탐색
-------------------------------------------
## Hive 연결( 선택 ) ##
#spark.sql.warehouse.dir hdfs://job-cluster/user/hive/warehouse
hive 연결 시 필요
5.3 Spark 실행 테스트
/application/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
/application/spark/examples/jars/spark-examples_2.12-3.4.3.jar 10
[ 콘솔 핵심 로그 ]
1) Spark 시작
Running Spark version 3.4.3
Submitted application: Spark Pi
→ 스파크 애플리케이션 시작
2) YARN에 애플리케이션 제출
Submitting application application_... to ResourceManager
Submitted application application_...
→ 스파크 애플리케이션 시작
3) 상태 변화 ( 중요 )
26/03/24 11:39:33 INFO Client: Application report for application_1773931628321_0007 (state: ACCEPTED)
26/03/24 11:39:34 INFO Client: Application report for application_1773931628321_0007 (state: RUNNING)
> state: ACCEPTED → RUNNING
→ ACCEPTED: 대기 (리소스 기다림)
→ RUNNING: 실행 시작
4) Executor 할당 ( 핵심 포인트 )
26/03/24 11:39:41 INFO YarnSchedulerBackend$YarnDriverEndpoint: Registered executor NettyRpcEndpointRef(spark-client://Executor) (192.168.122.63:39414) with ID 1, ResourceProfileId 0
26/03/24 11:39:41 INFO BlockManagerMasterEndpoint: Registering block manager m1:33431 with 2004.6 MiB RAM, BlockManagerId(1, m1, 33431, None)
26/03/24 11:39:46 INFO YarnSchedulerBackend$YarnDriverEndpoint: Registered executor NettyRpcEndpointRef(spark-client://Executor) (192.168.122.64:49338) with ID 2, ResourceProfileId 0
26/03/24 11:39:46 INFO BlockManagerMasterEndpoint: Registering block manager m2:45787 with 2004.6 MiB RAM, BlockManagerId(2, m2, 45787, None)
26/03/24 11:39:46 INFO YarnSchedulerBackend$YarnDriverEndpoint: Registered executor NettyRpcEndpointRef(spark-client://Executor) (192.168.122.65:54376) with ID 3, ResourceProfileId 0
26/03/24 11:39:46 INFO YarnClientSchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.8
26/03/24 11:39:47 INFO BlockManagerMasterEndpoint: Registering block manager s1:42585 with 2004.6 MiB RAM, BlockManagerId(3, s1, 42585, None)
Registered executor ... (ID 1)
Registered executor ... (ID 2)
Registered executor ... (ID 3)
→ 클러스터 노드에서 Executor 분산 실행됨
→ 즉, 분산 처리 환경 정상 동작 ( Good! )
5) Job 실행 시작
Starting job: reduce at SparkPi.scala
Got job 0 with 10 output partitions
→ 작업 시작
→ 데이터를 10개의 파티션으로 나눈다~
6) Task 분산 실행 ( 핵심 )
26/03/24 11:39:47 INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0) (m1, executor 1, partition 0, PROCESS_LOCAL, 7499 bytes)
26/03/24 11:39:47 INFO TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1) (s1, executor 3, partition 1, PROCESS_LOCAL, 7499 bytes)
26/03/24 11:39:47 INFO TaskSetManager: Starting task 2.0 in stage 0.0 (TID 2) (m2, executor 2, partition 2, PROCESS_LOCAL, 7499 bytes)
26/03/24 11:39:47 INFO TaskSetManager: Starting task 3.0 in stage 0.0 (TID 3) (m1, executor 1, partition 3, PROCESS_LOCAL, 7499 bytes)
> Starting task ... partition 0
> Starting task ... partition 1
→ 파티션 단위로 병렬 처리
7) Task 완료
Finished task ... (10/10)
→ 모든 Task 완료 → 스테이지 완료
8) Job 완료
Job 0 finished
Pi is roughly 3.141075...
→ 결과 출력
9) 종료
SparkContext is stopping
Successfully stopped SparkContext
→ 잡 종료
5.4 Spark 대화형 콘솔
개발/테스트할 때 사용
## Python ##
$SPARK_HOME/bin/pyspark
→ 스파크 세션 나오면 성공
----------------------------
## Scala ##
$SPARK_HOME/bin/spark-shell
----------------------------
## SQL ##
$SPARK_HOME/bin/spark-sql
→ 바로 SQL 실행 가능
5.5 클라우드에서 실행
- Databricks 사용
- 장점
- 설치 필요 없음
- 바로 실행 가능
- 노트북 기반
- 단점
- 클라우드 비용
6) 책을 통한 실습 예제 데이터
책을 통해 학습하는 과정에서 다양한 예제 데이터 소스를 사용하게 됩니다.
해당 데이터는 공식 저장소가 아닌, 역자가 제공하는 GitHub 저장소에서 내려받아야 합니다.
GitHub - PingPingE/Spark
Contribute to PingPingE/Spark development by creating an account on GitHub.
github.com

1. Apache Spark 정의
- 클러스터 환경에서 데이터를 병렬 처리하는 범용 연산 엔진.
- SQL, 머신러닝, 스트리밍까지 하나의 엔진과 API로 처리 가능.
2. 스파크 철학
- 데이터 처리 통합 → SQL, ML, 스트리밍 등 여러 시스템 필요 없이 단일 엔진에서 처리.
- 데이터는 한 번만 읽고, 실행 계획(DAG) 기반으로 최적화.
3. 컴퓨팅 엔진 관점
- Spark는 계산만 담당, 데이터 저장은 HDFS, S3, DB 등 외부 시스템 사용.
4. Spark vs MapReduce
- Spark: 메모리 기반, DAG 실행, 반복 연산 강점, 빠르고 유연 ( 디버깅 복잡 )
- MapReduce: 디스크 기반, 단계형 실행, 안정적이지만 느림 ( 디버깅 간단 )
5. 스파크 생태계 라이브러리
- Spark SQL, MLlib, Structured Streaming, GraphX 등 다양한 데이터 처리 가능
6. 등장 배경
- MapReduce 반복 작업 비효율 문제 해결
- 메모리 기반 처리와 DAG 기반 최적화로 → 중간 데이터 재사용
7. 설치 및 환경 설정 핵심
- JVM 환경 필요, 하둡 버전과 호환 확인 필수
- 환경 변수: JAVA_HOME, HADOOP_CONF_DIR, SPARK_LOG_DIR
- 기본 옵션: spark.master, deployMode, driver/executor 리소스 설정
8. 클러스터 실행 핵심
- Executor는 클러스터 노드에서 분산 실행
- Job → Stage → Task 단위로 파티션별 병렬 처리
'데이터 엔지니어( 이론 공부 ) > spark' 카테고리의 다른 글
| Apache Spark ( Spark 최적화 하기 ) (0) | 2026.04.28 |
|---|---|
| Apache Spark ( Spark submit & partition & shuffle ) (0) | 2026.04.25 |
| Apache Spark ( 데이터프레임 ) (0) | 2026.04.17 |
| Apache Spark ( 핵심 개념 ) (1) | 2026.04.14 |
| 2. 스파크 간단히 살펴보기 ( 빅데이터와 스파크 살펴보기 ) (0) | 2026.03.25 |