Spark Operator 란?


Spark Operator 는 Kubernetes 환경에서 Apache Spark Application 을 배포하고 관리하기 위한 Custom Controller 다.

구성 요소

  1. Custom Resource Definitions (CRDs)
    • SparkApplication: 하나의 Spark Application 을 정의
    • ScheduledSparkApplication: 주기적으로 실행되는 Spark Application 을 정의
  2. Operator
    • CRD 를 감지하고 필요한 K8s Object 를 생성, 업데이트, 삭제
    • Spark Driver 와 Executor Pod 를 관리
  3. Admission Webhook
    • K8s API 서버에 요청이 도달하기 전에 요청을 가로채어 리소스에 필요한 설정을 주입
    • Spark Application Pod 가 생성될 때 환경 변수, 볼륨 마운트 등 필요한 설정을 주입

Spark Operator 의 작동 방식

  1. 사용자가 Spark Application 을 생성
  2. Operator 가 이를 감지하고 K8s Object 를 생성
  3. Spark Driver Pod 가 생성됨
  4. Spark Driver 가 Executor Pod 생성 요청 및 관리
  5. Spark Job 이 종료되면 Operator 가 리소스를 정리

Spark Operator 설치


# 네임스페이스 생성
kubectl create namespace spark-operator
 
# Helm Repo 추가 및 업데이트
helm repo add spark-operator https://kubeflow.github.io/spark-operator
helm repo update
 
# 설치
helm install spark-operator spark-operator/spark-operator \
  -n spark-operator \
  --set enableWebhook=true \
  --set image.tag=v1beta2-1.1.27-3.5.0 \
  --set serviceAccounts.spark.create=true \
  --set serviceAccounts.spark.name=spark-sa
 
# 설치 확인
kubectl get pods -n spark-operator
kubectl get crds | grep sparkoperator

Helm 차트를 통해 Spark Operator 를 손쉽게 설치할 수 있으며, Webhook 을 활성화하면 Pod 에 필요한 설정(라벨/어노테이션/환경변수)을 자동 주입할 수 있다.

Spark Job 실행


SparkApplication CRD 사용

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-minimal
  namespace: data-jobs
spec:
  type: Scala
  mode: cluster
  image: gcr.io/spark-operator/spark:v3.5.0
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.0.jar
  sparkVersion: 3.5.0
  driver:
    cores: 1
    memory: 512m
    serviceAccount: spark-sa
  executor:
    instances: 2
    cores: 1
    memory: 512m
  restartPolicy:
    type: Never
  timeToLiveSeconds: 600  # 완료 후 10분 뒤 Driver/Executor Pod 정리

YAML 파일로 SparkApplication CRD 를 생성하면 Operator 가 이를 감지하고 Driver Pod 을 생성한다. SparkApplication CRD 를 사용하여 Spark Job 을 실행할 경우 TTL 을 적용해 Completed 상태의 Pod 를 자동으로 제거할 수 있다.