728x90
이 글에서 다루는 개념
Spark 기반의 데이터 파이프라인을 효율적으로 배포하고 운영하는 전략을 다룹니다.
이번 글에서는 다음 내용을 학습합니다.
- Spark 데이터 파이프라인 배포 개요
- Spark 배포 모드별 장단점 (Standalone, YARN, Kubernetes)
- Airflow와 Spark 연동하여 파이프라인 자동화
- CI/CD를 활용한 Spark 파이프라인 배포
- Spark 작업 모니터링 및 유지보수 방법
1️⃣ Spark 데이터 파이프라인 배포 개요
📌 데이터 파이프라인 배포란?
- 데이터를 수집 → 처리 → 저장하는 Spark 애플리케이션을 운영 환경에 배포하는 과정
- 실시간 또는 배치 처리 방식에 따라 다른 배포 전략 적용
📌 Spark 배포 방식 비교
배포 방식 | 설명 | 장점 | 단점 |
Standalone | 단일 Spark 클러스터에서 실행 | 설정 간단 | 확장성 낮음 |
YARN | Hadoop 클러스터에서 실행 | 확장 가능, 안정적 | 설정 복잡 |
Kubernetes | 컨테이너 기반 Spark 실행 | 자동 스케일링 가능 | 설정 복잡 |
📌 배포 방식 선택 가이드
- 빠른 개발 & 테스트 → Standalone 모드
- Hadoop 클러스터 운영 중 → YARN 모드
- 컨테이너 환경 (K8s, Cloud) → Kubernetes 모드
2️⃣ Spark 배포 모드별 장단점
Standalone 모드 배포
📌 Standalone 모드에서 Spark 애플리케이션 실행
spark-submit --master spark://<MASTER_NODE>:7077 my_spark_script.py
- 별도 클러스터 매니저 없이 Spark 자체 리소스 관리자 사용
- 소규모 프로젝트나 테스트 환경에 적합
YARN 모드 배포
📌 YARN 클러스터에서 Spark 실행
spark-submit --master yarn --deploy-mode cluster my_spark_script.py
- Hadoop 클러스터에서 리소스 할당 가능
- 대규모 배치 작업에 적합
- YARN UI (http://<resource_manager>:8088)에서 상태 모니터링 가능
Kubernetes 모드 배포
📌 Kubernetes 클러스터에서 Spark 실행
spark-submit \
--master k8s://https://<K8S_MASTER>:6443 \
--deploy-mode cluster \
--conf spark.kubernetes.container.image=my-spark-image \
my_spark_script.py
- 컨테이너 환경에서 실행 가능 (AWS EKS, GCP GKE, Azure AKS 등)
- 자동 스케일링 지원
- 복잡한 네트워크 설정 필요
3️⃣ Airflow와 Spark 연동하여 파이프라인 자동화
📌 Airflow DAG에서 Spark 작업 실행 (spark_submit_operator.py)
from airflow import DAG
from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator
from datetime import datetime
default_args = {"owner": "airflow", "start_date": datetime(2024, 3, 20)}
dag = DAG("spark_pipeline", default_args=default_args, schedule_interval="@daily")
spark_task = SparkSubmitOperator(
task_id="run_spark_job",
application="/path/to/my_spark_script.py",
conn_id="spark_default",
dag=dag,
)
spark_task
📌 Airflow 실행 후 DAG 트리거
airflow dags trigger spark_pipeline
4️⃣ CI/CD를 활용한 Spark 파이프라인 배포
📌 GitHub Actions을 활용한 Spark 애플리케이션 배포 (.github/workflows/spark_ci_cd.yml)
name: Spark CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 코드 체크아웃
uses: actions/checkout@v2
- name: Docker 이미지 빌드
run: docker build -t my-spark-image .
- name: Docker Hub 로그인
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Docker 이미지 푸시
run: docker push my-spark-image
- name: Kubernetes에 배포
run: kubectl apply -f k8s_spark_job.yaml
📌 Spark 배포 자동화 단계
- 코드 변경 감지 (git push)
- Docker 이미지 빌드 & 푸시
- Kubernetes에 Spark Job 배포
5️⃣ Spark 작업 모니터링 및 유지보수 방법
📌 Spark UI에서 실행 상태 확인 (http://localhost:4040)
spark-submit --master local my_spark_script.py
- DAG 실행 흐름 확인
- 실행 시간, 리소스 사용량 체크
📌 YARN에서 실행 상태 확인
yarn application -list
📌 Spark 작업 로그 확인 (sparkEventLog.enabled)
spark.eventLog.enabled true
spark.eventLog.dir hdfs:///spark-logs
- Spark History Server에서 과거 실행 내역 조회 가능 (http://<HISTORY_SERVER>:18080)
📌 실전 문제: Spark 데이터 파이프라인 배포 연습하기
✅ 문제 1: Standalone 모드에서 Spark 작업 실행
📌 Standalone 모드에서 Spark 애플리케이션을 실행하는 명령어를 작성하세요.
# 🔽 여기에 코드 작성
spark-submit --master spark://<MASTER_NODE>:7077 my_spark_script.py
✅ 문제 2: YARN 모드에서 Spark 작업 실행
📌 YARN 클러스터에서 Spark 애플리케이션을 실행하는 명령어를 작성하세요.
# 🔽 여기에 코드 작성
spark-submit --master yarn --deploy-mode cluster my_spark_script.py
✅ 문제 3: Airflow에서 Spark 작업 실행
📌 Airflow DAG에서 Spark 작업을 실행하는 SparkSubmitOperator를 작성하세요.
# 🔽 여기에 코드 작성
from airflow import DAG
from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator
from datetime import datetime
default_args = {"owner": "airflow", "start_date": datetime(2024, 3, 20)}
dag = DAG("spark_pipeline", default_args=default_args, schedule_interval="@daily")
spark_task = SparkSubmitOperator(
task_id="run_spark_job",
application="/path/to/my_spark_script.py",
conn_id="spark_default",
dag=dag,
)
spark_task
✅ 문제 4: CI/CD를 활용한 Spark 배포 자동화
📌 Spark 애플리케이션을 자동 배포하는 GitHub Actions YAML 파일을 작성하세요.
# 🔽 여기에 코드 작성
name: Spark CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 코드 체크아웃
uses: actions/checkout@v2
- name: Docker 이미지 빌드
run: docker build -t my-spark-image .
- name: Docker Hub 로그인
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Docker 이미지 푸시
run: docker push my-spark-image
- name: Kubernetes에 배포
run: kubectl apply -f k8s_spark_job.yaml
728x90
'Data Engineering > python' 카테고리의 다른 글
EP30 | 고급 Python 활용 #19 | Spark를 활용한 데이터 엔지니어링 Best Practices (0) | 2025.03.19 |
---|---|
EP29 | 고급 Python 활용 #18 | Spark와 Delta Lake를 활용한 데이터 레이크 아키텍처 (0) | 2025.03.19 |
EP28 | 고급 Python 활용 #17 | Spark와 Hadoop을 결합한 대규모 데이터 분석 아키텍처 (0) | 2025.03.19 |
EP27 | 고급 Python 활용 #16 | Spark를 활용한 머신러닝 기반 이상 탐지 시스템 구축 (0) | 2025.03.19 |
EP26 | 고급 Python 활용 #15 | Spark를 활용한 실시간 데이터 파이프라인 구축 (0) | 2025.03.19 |