
Apache Spark는 대규모 데이터를 빠르게 처리하는 오픈소스 분산 데이터 처리 플랫폼이다.
“빅데이터 시대의 표준 엔진”이라고 불릴 정도로, 배치 처리부터 실시간 스트리밍, 머신러닝, 그래프 분석까지 모두 지원한다.
하둡의 MapReduce는 안정적이지만 너무 느렸다.
UC Berkeley 연구팀이 이를 개선하기 위해 2014년 발표한 것이 Spark.
Spark는 메모리 기반 연산(In-Memory Computing) 을 도입해 MapReduce보다 수십 배 빠른 속도를 보여줬다.
👉 “1TB 데이터를 1대 서버에서 하루 걸려 돌릴 연산을, 100대 클러스터에서 몇 분 만에 끝낼 수 있는 것”
Apache Spark는 단순한 “빅데이터 엔진”을 넘어,
하둡 MapReduce를 대체한 차세대 분산 데이터 처리 플랫폼이다.
구글이 제안한 분산 처리 모델 → 하둡의 핵심 처리 엔진으로 자리잡음
동작 방식:
(key, value) 쌍으로 변환장점: 단순하고 안정적, 장애 내성 강함
단점: 느리다 (매번 중간 결과를 디스크에 기록 → I/O 병목)
👉 즉, “안정적이지만 속도가 발목을 잡는 엔진”
Spark는 UC Berkeley에서 MapReduce의 한계를 극복하기 위해 개발.
👉 MapReduce는 배치 전용, Spark는 범용 분산 처리 플랫폼
데이터 읽기(HDFS)
→ Map Task
→ 디스크 저장
→ Shuffle/Sort
→ Reduce Task
→ 디스크 저장
👉 단계마다 디스크 접근 → I/O 부담 ↑
데이터 읽기(HDFS/S3/Kafka 등)
→ 메모리에 올림
→ Transformations (map, filter, join)
→ Actions (collect, save)
→ 필요할 때만 디스크 저장
👉 메모리 유지 덕분에 속도 ↑
| 구분 | MapReduce | Spark |
|---|---|---|
| 처리 방식 | 디스크 기반 | 메모리 기반 |
| 속도 | 느림 (I/O 많음) | 수십 배 빠름 |
| 지원 영역 | 배치 처리 | 배치 + 스트리밍 + SQL + ML + 그래프 |
| API | Java 기반, 코드 복잡 | 다양한 언어 지원 (Scala, Java, Python, R) |
| 사용 난이도 | 러닝 커브 큼 | 상대적으로 쉬움 |
| 활용 사례 | 단순 집계, 로그 분석 | 실시간 대시보드, ETL, 머신러닝, 추천 시스템 |
👉 Spark는 “다음날 아침에 보는 데이터”를 “지금 당장 볼 수 있는 데이터”로 바꿔줌
좋아 👍 이번 글은 Spark Streaming에 대해 블로그용으로 정리해줄게.
Spark 소개 → Spark vs MapReduce 비교 → 실시간 처리(Spark Streaming) 흐름으로 가면 딱 맞아.
과거엔 데이터를 모아서 밤에 배치로 돌리고, 아침에 리포트를 확인하는 방식이 일반적이었다.
하지만 지금은 다르다.
👉 이런 요구가 바로 실시간 스트리밍 처리를 필요로 한다.
Spark Streaming은 사실 “마이크로 배치(Micro-batch)”라는 방식을 쓴다.
👉 이 한계를 보완한 게 Structured Streaming (Spark 2.x부터 도입)
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분 단위 클릭 수를 집계하는 예제
| 구분 | Kafka Streams | Spark Streaming |
|---|---|---|
| 실행 방식 | 라이브러리 (앱 안에서 실행) | Spark 클러스터 필요 |
| 처리 규모 | 소규모~중간 | 대규모(수십~수백 노드) |
| 복잡한 연산 | 제한적 (윈도우, 조인 정도) | 강력 (SQL, ML, 그래프) |
| 장점 | 가볍고 빠른 배포 | 대규모, 복잡한 처리에 강함 |
| 활용 | 마이크로서비스 스트리밍 | 데이터 플랫폼 스트리밍 |
👉 간단한 실시간 처리 → Kafka Streams
👉 대규모, 복잡한 분석 → Spark Streaming