1. Spark 란?
대규모 데이터를 메모리 기반으로 빠르게 분산 처리하는 엔진
1-1. 스파크를 왜 쓰는가?
- 인메모리 처리 → 디스크 기반인 맵리듀스 보다 훨씬 빠름 → 특히 반복 연산에 강점
- 반복 연산 최적화
- SQL / ML / Streaming 지원
- 다양한 언어 지원 ( Python, Java, 스칼라, SQL )
[ 스파크 특징 ]
- 인메모리 처리
- DAG 기반 실행
- 자동 최적화 ( 카탈리스트 옵티마이저 )
1-2. 스파크 핵심 구조
[ 드라이버 ]
- 전체 작업 계획 수립
- DAG 생성
- task 할당 ( 데이터 지역성 고려 )
[ 익스큐터 ]
- 실제 데이터 처리 ( task 실행 )
[ 클러스터 매니저 ( Yarn ) ]
- 클러스터 리소스를 고려해 드라이버 + 익스큐터 컨테이너 할당
1-3. 스파크 실행 흐름 ( 핵심 )
코드 실행
↓
Logical Plan 생성
↓
Catalyst Optimizer (최적화 → I/O 감소)
↓
Physical Plan (DAG 생성)
↓
Stage / Task 분해 (Stage / Task 단위)
↓
YARN 자원 할당
↓
Executor 병렬 처리
↓
결과 반환
2. Hadoop 이란?
하둡은 대용량 데이터를 안정적으로 저장하고 효율적으로 분산 처리하기 위해 사용한다.
2-1. 하둡을 쓰는 이유
[ 안정적인 데이터 저장 ]
- 파일을 블록 단위로 나눠 저장 → 각 블록을 여러 데이터노드에 복제 → 일부 노드가 죽어도 데이터 복구 가능
- 체크섬 내장 기능을 통해 데이터 무결성 보장
[ 데이터 지역성 ]
하둡은 기반 환경에서 분산 엔진은 데이터가 있는 곳에서 연산을 수행 ( 네트워크 병목 최소화 → 분산처리 성능 향상 )
- 네임노드가 데이터 블록이 어디있는지 메타정보를 메모리에 관리
- 분산 처리시 데이터가 저장된 노드에서 연산을 실행
- 네트워크 이동을 최소화해서 분산 처리 속도 향상
[ 하둡에코시스템 ]
하둡은 단일 프레임워크를 넘어 빅데이터 처리 플랫폼으로 확장중
- Yarn → 클러스터 자원 관리
- Hive → 데이터 웨어하우스 ( SQL 처럼 하둡 데이터 분석 )
- Spark → 인메모리 기반 분산 처리 엔진
- 등 다양한 도구들이 Hadoop 위에서 동작
2-2. 하둡 구조
- 네임노드 → HDFS의 네임스페이스를 관리 + 블록 메타정보를 메모리에 관리
- 데이터노드 → 실제 데이터 저장
네임노드 고가용성 중요!
네임노드가 없으면 블록이 존재해도 재조합 불가능
3. 스파크는 왜 하둡을 활용하는가?
스파크는 분산 엔진이고, 하둡은 데이터 저장소
3-1. 데이터 지역성 ( 중요 )
데이터 지역성 이란?
→ 하둡기반 환경에서 분산엔진 처리시 데이터가 있는 곳에서 연산을 실행하는 것
→ 네트워크 병목을 줄이고 분산 처리 성능을 극대화 ↑
3-2. 스파크 + HDFS
1. Spark 실행 시
[HDFS / DataNode]
Node A (데이터 블록 저장)
│
│ (1) 데이터 위치 정보 전달
│ → Driver (DAG Scheduler)
▼
[Driver]
│
│ (2) Task 생성 + 스케줄링
│ "Node A에 있는 데이터니까 Node A로 보내자"
▼
[Cluster Manager (YARN 등)]
│
│ (3) Executor 할당
▼
Node A ─────────────────────────────
│ Executor (Node A에 생성됨)
│
│ (4) Task 실행
│ ┌──────────────────────┐
│ │ Task 1 (data local) │ ← 데이터가 있는 곳에서 실행
│ │ Task 2 (data local) │
│ └──────────────────────┘
│
│ (5) HDFS 블록 직접 읽기
│ → 네트워크 병목 제거
└───────────────────────────────
4. 스파크 데이터 구조
[ RDD ]
- 장점 : 직접 제어 가능 → 세부적인 최적화 가능
- 단점 : 내부 최적화 없음 → 최적화 직접 해야 함..
[ DataFrame ] → 현재 표준
- 장점 : 카탈리스트 옵티마이저 기반 최적화 자동 적용
- 단점 : 내부 실행 제어 어려움 → 매우 로우 레벨 최적화는 제한됨
5. PySpark 실습
[ 실습 목표 ]
1. 스파크 세션 생성 ( 스파크 실행 객체 )
2. 데이터 읽기 ( read ) → HDFS/Parquet 파일을 DataFrame으로 로딩 ( auth 로그 로딩 )
3. 구조 확인 ( printSchema, show ) → 데이터 컬럼 구조 확인, 샘플 확인 → 스키마 / 데이터 탐색
4. 데이터 필터링 ( filter ) → 조건에 맞는 데이터 추출 ( root 제외 + close 포함 로그 )
5. 결과 저장 ( write ) → 필터된 결과를 CSV로 HDFS에 저장
5-1. Spark 세션 생성
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("auth-log") \
.getOrCreate()
5-2. 데이터 읽기 ( read )
auth_log = spark.read.parquet("hdfs:///sy0218/spark/auth.parquet")
5-3. 데이터 구조 확인 ( printSchema, show )
auth_log.printSchema()
auth_log.show(5, False)
5-4. 데이터 필터링 ( filter )
from pyspark.sql import functions as F
auth_test = auth_log.filter(
(F.col("user") != "root") &
(F.col("message").contains("close"))
)
5-5. 데이터 저장 ( write )
auth_test.write \
.mode("overwrite") \
.csv("/work/sy0218/auth_log.csv")
5-6. 실습 실행 흐름
1. 코드 실행
- 스파크 세션 생성 + 데이터 프레임 정의
spark = SparkSession.builder.appName("auth-log").getOrCreate()
auth_log = spark.read.parquet("hdfs:///sy0218/spark/auth.parquet")
auth_test = auth_log.filter(
(F.col("user") != "root") &
(F.col("message").contains("close"))
)
---------------------------------------------
2. 논리 계획 생성
Scan (parquet)
→ Filter (user != root AND message like '%close%')
---------------------------------------------
3. 카탈리스트 옵티마이저 ( 최적화 )
- 필요한 컬럼만 읽기 ( Projection Pushdown )
- 조건 적용 ( Filter Pushdown )
즉, 필요한 컬럼과 조건을 적용해 → 불필요한 데이터 스캔 제거
---------------------------------------------
4. 물리 계획 생성 ( DAG 생성 )
HDFS Read → Filter → Output
---------------------------------------------
5. 스테이지 / 태스크 분해
- 병렬 실행 준비
- Task = Executor가 실행하는 최소 단위
---------------------------------------------
6. Yarn 자원 할당
- 데이터 지역성을 고려해 컨테이너 할당 ( 드라이버 + 익스큐터 )
---------------------------------------------
7. 익스큐터 병렬 처리
- 데이터 지역성을 고려해 실제 태스크 처리
---------------------------------------------
8. 결과 반환
auth_test.write \
.mode("overwrite") \
.csv("/work/sy0218/auth_log.csv")
- HDFS 저장
즉, 코드는 바로 실행되는 게 아니라, 계획 → 최적화 → 분산 실행으로 처리된다
'데이터 엔지니어( 이론 공부 ) > spark' 카테고리의 다른 글
| Apache Spark ( Spark 최적화 하기 ) (0) | 2026.04.28 |
|---|---|
| Apache Spark ( Spark submit & partition & shuffle ) (0) | 2026.04.25 |
| Apache Spark ( 데이터프레임 ) (0) | 2026.04.17 |
| 2. 스파크 간단히 살펴보기 ( 빅데이터와 스파크 살펴보기 ) (0) | 2026.03.25 |
| 1. 아파치 스파크란? ( 빅데이터와 스파크 살펴보기 ) (0) | 2026.03.24 |