Data Engineering/python

EP31 | 고급 Python 활용 #20 | Spark 기반 데이터 파이프라인 배포 전략

ygtoken 2025. 3. 19. 23:26
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 배포 자동화 단계

  1. 코드 변경 감지 (git push)
  2. Docker 이미지 빌드 & 푸시
  3. 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