본문 바로가기
어플리케이션

초고속 분산 처리 엔진 Apache Spark에 대해 알아보겠습니다.

by forward error correction Circle 2026. 4. 28.
반응형

Ⅰ. Apache Spark 란?

 대규모 데이터를 메모리(In-Memory) 위에서 처리하는 오픈소스 통합 분산 분석 엔진입니다. 하둡 맵리듀스가 매 단계마다 디스크에 결과를 쓰는 방식인 반면, Spark는 중간 데이터를 RAM에 유지하여 반복 연산 속도를 비약적으로 높입니다.

기존 방식
(Hadoop MapReduce)
Spark 방식
(Apache Spark)
매 단계 디스크 I/O 발생 In-Memory 처리, 최대 100배 빠름
배치 처리 전용 배치·스트리밍·ML·그래프 통합
Java 단일 언어 Python, Scala, Java, R, SQL
높은 지연 시간 낮은 지연, 실시간 대응

 더 이상 단순한 배치 처리 도구가 아닙니다. 하나의 엔진으로 ETL, 실시간 스트리밍, 머신러닝, 그래프 분석을 모두 처리하는 올인원 빅데이터 플랫폼입니다.

Ⅱ. Apache Spark 주요 특징

Spark가 빅데이터 생태계의 표준이 된 데는 네 가지 핵심 강점이 있습니다.
ⅰ. 압도적 속도 (In-Memory Computing)
  : 중간 결과를 메모리에 캐싱하여 반복 연산 시 MapReduce 대비 최대 100배 빠릅니다.
ⅱ. 멀티 언어
  : Python(PySpark), Scala, Java, R, SQL을 모두 지원해 팀의 기술 스택에 맞게 선택 가능합니다.
ⅲ. 올인원 라이브러리
  : Spark SQL, Spark Streaming, MLlib, GraphX를 단일 엔진 위에서 조합해 사용합니다.
ⅳ. 유연한 연동
  : HDFS, S3, Azure Blob, Cassandra, Kafka 등 주요 데이터 소스를 모두 지원합니다.

Ⅲ. Apache Spark 동작 방식(RDD & DAG)

RDD(Resilient Distributed Dataset)라는 분산 데이터 추상화 위에서, DAG(Directed Acyclic Graph)로 실행 계획을 최적화합니다.

구분 개념 설명 예시 특징
1 Transformation(변환) 데이터를 변환하는 연산으로 즉시 실행되지 않고 실행 계획만 생성 map(), filter(), groupBy()  Lazy (지연 실행), DAG에 누적
2 Action (액션) 결과를 요구하는 연산으로 이 시점에 실제 실행 발생 collect(), count(), show()  실행 트리거 역할
3 DAG 실행 Transformation들이 모여 DAG(실행 계획) 생성 후 Action 시 최적화 실행 map → filter → groupBy 스테이지 병합 및 최적화 수행
4 Lineage (계보) RDD가 생성된 과정을 추적하여 장애 시 재계산 가능 이전 RDD 참조  Fault Tolerance 제공
5 Lazy Evaluation  연산을 미루고 한 번에 최적 실행 체이닝된 연산 불필요한 연산 제거, 성능 최적화

Ⅳ. Apache Spark 아키텍처 구성 및 흐름도

Driver → Cluster Manager → Worker Node의 Master-Worker 구조로 동작합니다. Driver가 전체 작업을 설계하고, Cluster Manager가 자원을 배분하며, Worker의 Executor가 실제 연산을 수행합니다.

 

구성요소 주요역할 상세 설명
Driver Program 컨트롤 타워 메인 함수를 실행하고 SparkContext를 생성합니다. 사용자 코드를 기반으로 DAG(작엄 흐름도)를 설계하고, 이를 태스크 단위로 쪼개어 분배합니다.
Cluster Manager 자원 관리자 CPU·메모리 등 클러스터 자원을 관리합니다. Standalone(자체 관리), YARN(하둡 연동), Kubernetes(컨테이너) 등 다양한 모드를 선택할 수 있습니다.
Worker Node 실행 장소 실제 연산이 수행되는 물리·가상 머신입니다. 하나의 Worker에 하나 이상의 Executor가 실행됩니다.
Executor 실행 프로세스 Worker 위에서 구동되는 JVM 프로세스입니다. Task를 병렬 실행하고 중간 데이터를 메모리·디스크에 캐싱합니다.

Ⅴ. Apache Spark 설치 방법

전제 조건: Java 8 또는 11 (JAVA_HOME 환경 변수 설정 필요), Python 3.7+ (PySpark 사용 시)

ⅰ. Spark 다운로드

   : 공식 홈페이지에서 Hadoop 버전에 맞는 Pre-built 패키지를 선택합니다. (예: spark-3.5.x-bin-hadoop3.tgz)
ⅱ. 압축 해제 및 환경 변수 등록

   : 원하는 경로에 압축을 풀고 Shell 설정 파일에 경로를 추가합니다.

ⅲ. 실행 확인

   : 터미널에서 쉘을 실행해 정상 구동 여부를 확인합니다.

Linux / macOS 기준
# 1. Spark 다운로드 및 압축 해제
tar -xzf spark-3.5.x-bin-hadoop3.tgz
mv spark-3.5.x-bin-hadoop3 /opt/spark

# 2. 환경 변수 설정 (~/.bashrc 또는 ~/.zshrc에 추가)
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
export PYSPARK_PYTHON=python3
source ~/.bashrc

# 3. 실행 확인
spark-shell          # Scala 대화형 쉘
pyspark              # Python 대화형 쉘
spark-submit --version  # 버전 확인

Ⅵ. Apache Spark 사용 방법(PySpark)

가장 많이 사용되는 PySpark로 데이터를 읽고 변환하는 기본 패턴입니다.

(SparkSession 생성 → 데이터 로드 → 변환 → 액션) 의 흐름 입니다.

 

ⅰ. 기본 데이터 처리 흐름

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count

# 1. SparkSession 생성 (애플리케이션 진입점)
spark = SparkSession.builder \
    .appName("MySparkApp") \
    .config("spark.executor.memory", "4g") \
    .getOrCreate()

# 2. CSV 데이터 로드 (스키마 자동 추론)
df = spark.read.csv("data.csv", header=True, inferSchema=True)

# 3. 변환(Transformation) — 즉시 실행되지 않음
result = df.filter(col("age") > 20) \
           .groupBy("city") \
           .agg(count("*").alias("user_count")) \
           .orderBy("user_count", ascending=False)

# 4. 액션(Action) — 이 시점에 실제 실행
result.show(10)
result.write.parquet("/output/city_stats")

ⅱ. spark-submit 으로 클러스터에 제출

# YARN 클러스터에 PySpark 잡 제출 예시
spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --num-executors 10 \
  --executor-memory 8g \
  --executor-cores 4 \
  my_spark_app.py

Ⅶ. Apache Spark 자주 쓰는 명령어

CLI 명령어부터 DataFrame API까지, 실무에서 매일 사용하는 명령어를 목적별로 정리했습니다.

명령어 API 설명
spark-submit CLI 작성한 애플리케이션(.py/.jar)을 클러스터에 제출하여 실행합니다. 프로덕션 배포의 표준 방법입니다.
pyspark CLI 대화형 Python 쉘을 시작합니다. 데이터 탐색과 스크립트 프로토타이핑에 사용합니다.
df.show(n) DataFrame DataFrame의 상위 n개 행을 콘솔에 출력합니다. 기본값은 20입니다.
df.printSchema() DataFrame 컬럼명, 데이터 타입, nullable 여부를 트리 형태로 출력합니다. 데이터 확인 첫 단계에 필수입니다.
df.cache() DataFrame 자주 재사용하는 DataFrame을 메모리에 캐싱하여 반복 쿼리 성능을 높입니다.
df.explain() DataFrame Spark가 생성한 물리적 실행 계획을 출력합니다. 성능 튜닝 시 병목을 찾는 핵심 도구입니다.
spark.stop() Session SparkSession을 종료하고 클러스터 자원을 반납합니다. 잡 완료 후 반드시 호출합니다.

Ⅷ. Apache Spark 활용 방안

Apache Spark가 실무에서 빛을 발하는 대표적인 세 가지 시나리오입니다.
ⅰ. 스트리밍(실시간 로그 분석)
: Kafka와 Spark Streaming을 연동하여 초당 수백만 이벤트를 실시간 분석합니다. 이상 트래픽 탐지, 보안 모니터링에 활용됩니다.
ⅱ. 머신러닝(대규모 ML 파이프라인)
 : MLlib으로 수 테라바이트 데이터를 분산 학습합니다. 추천 시스템, 이상 탐지 모델, 클러스터링에 실전 적용됩니다.
ⅲ. ETL(데이터 웨어하우스 구축)
 : 다양한 소스에서 데이터를 추출·변환·적재하는 ETL 파이프라인의 핵심 엔진으로, Iceberg·Delta Lake와 함께 레이크하우스 구조를 완성합니다.

 

반응형