본문 바로가기
데이터 엔지니어( 이론 공부 )/spark

1. 아파치 스파크란? ( 빅데이터와 스파크 살펴보기 )

by 세용융용융용 2026. 3. 24.

[ "스파크 완벽 가이드" ] 공부한 후 정리한 내용 입니다

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 저장소에서 내려받아야 합니다.

PingPingE/Spark

 

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 단위로 파티션별 병렬 처리