Apache Spark & Spark Streaming

HelloPong·2025년 9월 1일

공부

목록 보기
28/39
post-thumbnail

⚡ Apache Spark란?

📌 한 줄 정의

Apache Spark는 대규모 데이터를 빠르게 처리하는 오픈소스 분산 데이터 처리 플랫폼이다.
“빅데이터 시대의 표준 엔진”이라고 불릴 정도로, 배치 처리부터 실시간 스트리밍, 머신러닝, 그래프 분석까지 모두 지원한다.


🐘 왜 Spark가 나왔을까? (배경)

  • 하둡의 MapReduce는 안정적이지만 너무 느렸다.

    • 매번 중간 결과를 디스크에 저장해야 해서 I/O 병목 발생
    • 반복 연산, 머신러닝, 스트리밍에는 비효율적
  • UC Berkeley 연구팀이 이를 개선하기 위해 2014년 발표한 것이 Spark.

  • Spark는 메모리 기반 연산(In-Memory Computing) 을 도입해 MapReduce보다 수십 배 빠른 속도를 보여줬다.


🏗️ Spark의 주요 컴포넌트

1. Spark Core

  • Spark의 기본 엔진
  • 클러스터 자원 관리, 태스크 분산 실행, RDD(Resilient Distributed Dataset) 기반 데이터 처리

2. Spark SQL

  • 분산 데이터 위에서 SQL 쿼리를 실행할 수 있음
  • Hive, RDB, Parquet, JSON 등 다양한 데이터 소스 지원

3. Spark Streaming / Structured Streaming

  • 실시간 데이터 스트리밍 처리 지원
  • Kafka, 소켓, 파일 등에서 들어오는 데이터를 거의 실시간으로 집계

4. MLlib (Machine Learning Library)

  • Spark 기반 머신러닝 라이브러리
  • 분산 환경에서 대규모 ML 학습/추론 가능

5. GraphX

  • 분산 그래프 처리 라이브러리
  • 예: 소셜 네트워크 그래프 분석, 최단 경로 탐색

🔄 Spark 동작 흐름 (간단)

  1. 데이터를 읽어옴 (HDFS, S3, Kafka, DB 등)
  2. 클러스터의 여러 노드에 데이터를 분산시킴
  3. 각 노드에서 병렬 연산 수행 (map, filter, join, groupBy 등)
  4. 결과를 모아 집계하거나 다시 저장

👉 “1TB 데이터를 1대 서버에서 하루 걸려 돌릴 연산을, 100대 클러스터에서 몇 분 만에 끝낼 수 있는 것”


💡 Spark의 장점

  • 빠르다: 메모리 기반 연산 → MapReduce보다 수십 배 향상
  • 다재다능하다: 배치 + 스트리밍 + SQL + ML + 그래프까지 통합 지원
  • 확장성: 수십~수천 대 클러스터까지 확장 가능
  • 유연성: HDFS, S3, Kafka, RDB 등 다양한 소스와 연동

📊 Spark를 쓰는 곳 (예시)

  • 배치 처리: 매일 새벽 1TB 로그를 집계해 리포트 생성
  • 실시간 스트리밍: Kafka 로그 → Spark Streaming → 실시간 대시보드
  • 머신러닝: 광고 클릭 예측 모델 학습, 추천 시스템 구축
  • 그래프 분석: SNS 팔로우 관계 분석, 추천 네트워크 탐색

✅ 정리

Apache Spark는 단순한 “빅데이터 엔진”을 넘어,
하둡 MapReduce를 대체한 차세대 분산 데이터 처리 플랫폼이다.

  • 배치, 스트리밍, SQL, ML, 그래프까지 올인원(All-in-one) 지원
  • “빠르면서도 범용적”이기 때문에 현재 데이터 엔지니어링의 표준으로 자리 잡았다.

⚡ Spark vs MapReduce — 왜 Spark가 더 빠르고 표준이 되었을까?

🐘 MapReduce 다시 짚기

  • 구글이 제안한 분산 처리 모델 → 하둡의 핵심 처리 엔진으로 자리잡음

  • 동작 방식:

    1. Map: 데이터를 (key, value) 쌍으로 변환
    2. Shuffle/Sort: 같은 key끼리 묶음
    3. Reduce: key별로 집계 후 결과 출력
  • 장점: 단순하고 안정적, 장애 내성 강함

  • 단점: 느리다 (매번 중간 결과를 디스크에 기록 → I/O 병목)

👉 즉, “안정적이지만 속도가 발목을 잡는 엔진”


⚡ Spark의 등장

Spark는 UC Berkeley에서 MapReduce의 한계를 극복하기 위해 개발.

  • 메모리 기반 연산(In-Memory Computing): 중간 데이터를 디스크가 아니라 메모리에 저장
  • RDD(Resilient Distributed Dataset): 분산 데이터셋을 효율적으로 관리
  • 범용성: 배치 + 스트리밍 + SQL + ML + 그래프까지 지원

👉 MapReduce는 배치 전용, Spark는 범용 분산 처리 플랫폼


🔄 처리 방식 비교

MapReduce 처리 흐름

데이터 읽기(HDFS)
 → Map Task
 → 디스크 저장
 → Shuffle/Sort
 → Reduce Task
 → 디스크 저장

👉 단계마다 디스크 접근 → I/O 부담 ↑

Spark 처리 흐름

데이터 읽기(HDFS/S3/Kafka 등)
 → 메모리에 올림
 → Transformations (map, filter, join)
 → Actions (collect, save)
 → 필요할 때만 디스크 저장

👉 메모리 유지 덕분에 속도 ↑


📊 Spark vs MapReduce 비교표

구분MapReduceSpark
처리 방식디스크 기반메모리 기반
속도느림 (I/O 많음)수십 배 빠름
지원 영역배치 처리배치 + 스트리밍 + SQL + ML + 그래프
APIJava 기반, 코드 복잡다양한 언어 지원 (Scala, Java, Python, R)
사용 난이도러닝 커브 큼상대적으로 쉬움
활용 사례단순 집계, 로그 분석실시간 대시보드, ETL, 머신러닝, 추천 시스템

💡 실제 예시

MapReduce

  • 매일 밤 1TB 로그를 모아 “페이지뷰 집계 리포트” 생성
  • 결과는 다음날 아침에 확인 가능

Spark

  • Kafka에서 로그 스트리밍 수집
  • Spark Streaming으로 실시간 페이지뷰 집계
  • 대시보드에 즉시 반영

👉 Spark는 “다음날 아침에 보는 데이터”를 “지금 당장 볼 수 있는 데이터”로 바꿔줌


✅ 정리

  • MapReduce: 안정적이지만 느린 배치 전용 엔진
  • Spark: 메모리 기반, 빠르고 범용적인 차세대 엔진
  • Spark가 MapReduce의 자리를 대체하면서, 지금은 빅데이터 처리의 표준이 되었다.

좋아 👍 이번 글은 Spark Streaming에 대해 블로그용으로 정리해줄게.
Spark 소개 → Spark vs MapReduce 비교 → 실시간 처리(Spark Streaming) 흐름으로 가면 딱 맞아.


⚡ Spark Streaming — 배치에서 실시간으로

📌 왜 실시간 처리가 필요할까?

과거엔 데이터를 모아서 밤에 배치로 돌리고, 아침에 리포트를 확인하는 방식이 일반적이었다.
하지만 지금은 다르다.

  • 사용자의 클릭 수를 실시간으로 집계해서 A/B 테스트 대시보드에 반영해야 하고,
  • 금융 거래에서는 이상 거래를 즉시 탐지해야 하며,
  • IoT 센서 데이터는 밀리초 단위로 반응해야 한다.

👉 이런 요구가 바로 실시간 스트리밍 처리를 필요로 한다.


🏗️ Spark Streaming이란?

  • Spark Core 위에 만들어진 실시간 데이터 처리 엔진
  • Kafka, 소켓, 파일, HDFS 등 다양한 소스로부터 스트리밍 데이터를 받아 처리할 수 있다.
  • Spark의 강점(배치+SQL+ML+그래프)을 그대로 활용할 수 있다.

🔄 동작 원리

Spark Streaming은 사실 “마이크로 배치(Micro-batch)”라는 방식을 쓴다.

  • 스트리밍 데이터를 1초~수초 단위로 잘라서 작은 배치처럼 처리한다.
  • 그래서 거의 실시간에 가깝게 동작하지만, 완전 이벤트 단위 실시간은 아니다.

👉 이 한계를 보완한 게 Structured Streaming (Spark 2.x부터 도입)

  • 더 선언적이고 SQL 친화적인 API 제공
  • 이벤트 단위 처리에 가까운 동작 가능

📝 간단한 코드 예시 (Structured Streaming)

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("StreamingExample").getOrCreate()

# Kafka 토픽에서 메시지 읽기
df = spark.readStream.format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "user-clicks") \
    .load()

# 메시지에서 value 컬럼만 추출 후 문자열로 변환
clicks = df.selectExpr("CAST(value AS STRING)")

# 실시간 집계 (페이지별 클릭 수)
from pyspark.sql.functions import col, window

clickCounts = clicks.groupBy(
    window(col("timestamp"), "1 minute"),
    col("page")
).count()

# 콘솔에 출력
query = clickCounts.writeStream.outputMode("complete").format("console").start()
query.awaitTermination()

👉 Kafka 토픽에서 클릭 로그를 읽어, 페이지별로 1분 단위 클릭 수를 집계하는 예제


💡 Spark Streaming의 장점

  1. 범용성: 배치, SQL, ML, 그래프 기능과 통합 가능
  2. 확장성: 수십~수백 노드 클러스터에서 동작
  3. 유연성: Kafka, HDFS, S3, DB 등 다양한 소스와 연계
  4. 실시간 분석: 대시보드, 알림, Fraud Detection 등 활용 가능

📊 Spark Streaming vs Kafka Streams 비교

구분Kafka StreamsSpark Streaming
실행 방식라이브러리 (앱 안에서 실행)Spark 클러스터 필요
처리 규모소규모~중간대규모(수십~수백 노드)
복잡한 연산제한적 (윈도우, 조인 정도)강력 (SQL, ML, 그래프)
장점가볍고 빠른 배포대규모, 복잡한 처리에 강함
활용마이크로서비스 스트리밍데이터 플랫폼 스트리밍

👉 간단한 실시간 처리 → Kafka Streams
👉 대규모, 복잡한 분석 → Spark Streaming


✅ 정리

  • Spark Streaming은 배치 처리의 Spark실시간으로 확장한 기능이다.
  • 마이크로 배치 기반이지만 Structured Streaming으로 점점 이벤트 기반에 가까워지고 있다.
  • Kafka Streams와는 경쟁이 아니라 규모와 복잡성의 차이로 선택하면 된다.

0개의 댓글