
Spark job 실행시 Driver Pod가 뜨고 그 이후 해당 코드 실행에 필요한 리소스와 비례하게 Executor Pod가 떠서 Spark 작업을 원활히 처리한다.EMR on EKS이라는 서비스를 어느정도 패키징해서 제공해주고 있기 때문에 그리 어렵지 않게 내가 원하는 방식으로 Spark 작업이 처리되는 환경을 구축할 수 있었을 것이다. 하지만 현재는 NCloud의 NKS 환경에서 EMR on NKS느낌으로 서비스를 구축하여야 했기 때문에 더 많은 노력과 생각과 시간들이 들어갔다.
- Kubernetes Native한 Spark 환경을 구축하며 작업 실행시 Driver Pod가 실행되고 Executor Pod가 가변적으로 뜨면서 작업을 처리하고 끝나면 없어진다.
- 내가 작성한 Custom한 Pyspark script가 실행되어야 한다.
- Pyspark script를 실행하여 NCloud Object Storage 혹은 AWS S3 Bucket에 정제된 Dataframe을 parquet 혹은 csv 파일 형태로 저장될 수 있어야 한다.
쿠버네티스에 Spark 실행 환경을 구축하기 위한 Helm 차트에는 크게 Bitnami에서 지원해주는 Spark, GCP에서 지원해주는 spark-operator 두 가지가 있다고 생각된다.(물론 더 있을 수 있지만 현재로선 더 찾아보진 않았다.)
spark-on-k8s-operator해당 글에서는 2번의 spark-on-k8s-operator Helm Chart를 사용하여 환경 구성을 해볼것이다.
1. Helm Repo Add
> helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator
2. Helm을 이용한 설치
> helm install spark spark-operator/spark-operator \
--set webhook.enable=true \
--set webhook.port=443
3. 설치 확인
- init pod가 하나 뜨고 Completed되면 spark-operator가 뜨면서 Running 상태로 되면 설치가 잘 된것이다.
> kubectl get all
NAME READY STATUS RESTARTS AGE
pod/spark-spark-operator-58bf8d4cb-m74fp 1/1 Running 0 27s
pod/spark-spark-operator-webhook-init-llgbk 0/1 Completed 0 33s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/spark-spark-operator-webhook ClusterIP 198.19.248.177 <none> 443/TCP 27s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/spark-spark-operator 1/1 1 1 27s
NAME DESIRED CURRENT READY AGE
replicaset.apps/spark-spark-operator-58bf8d4cb 1 1 1 27s
NAME COMPLETIONS DURATION AGE
job.batch/spark-spark-operator-webhook-init 1/1 6s 33s
위와 같이 spark-operator-webhook-init pod가 Completed 상태이고, spark-operator pod가 Running 상태라면 Helm을 통한 spark-on-k8s-operator 차트가 잘 설치가 되어 Spark 작업을 실행할 수 있는 환경이 구성된 것이다.
spark-on-k8s-operator 환경에서는 Spark 작업을 실행하는 방법이 두 가지가 있다.spark-summit을 통한 작업 실행
spark-submit으로 작업을 실행해보도록 할 것이다.control plane 주소 및 service account 이름은 아래 명령어들을 통해 확인할 수 있다.\
1. exec into spark-operator deployment
> kubectl exec -it deploy/spark-spark-operator -- bash
root@spark-spark-operator-58bf8d4cb-m74fp:/opt/spark/work-dir#
2. spark-summit cli 실행
- /opt/spark/examples/src/main/python/pi.py 이 경로에 기본적으로 존재하는 python 스크립트 실행
> /opt/spark/bin/spark-submit \
--master k8s://[Cluster control plane 도메인] \
--deploy-mode cluster \
--driver-cores 1 \
--driver-memory 512m \
--num-executors 1 \
--executor-cores 1 \
--executor-memory 512m \
--class org.apache.spark.examples.SparkPi \
--conf spark.kubernetes.namespace=[실행되는 namespace 이름] \
--conf spark.kubernetes.container.image=apache/spark:latest \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=[service account 이름] \
local:///opt/spark/examples/src/main/python/pi.py

SparkApplication Operator를 통한 작업 실행
SparkApplication Kind를 가진 YAML 파일로 작업을 실행한다.
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: pyspark-pi
spec:
type: Python
pythonVersion: "3"
mode: cluster
image: apache/spark
imagePullPolicy: Always
mainApplicationFile: local:///opt/spark/examples/src/main/python/pi.py
sparkVersion: "3.5.0"
driver:
cores: 1
coreLimit: "1200m"
memory: "512m"
labels:
version: 3.5.0
serviceAccount: [service account 이름]
executor:
cores: 1
instances: 1
memory: "512m"
labels:
version: 3.5.0
kubectl apply -f sample-job.yaml

spark-on-k8s-operator를 통해 환경 구축 후 샘플 작업을 실행하는 과정을 다뤄보았다.
안녕하세요. 좋은 글 잘 읽었습니다.
혹시 serviceaccount 어떤거 사용하셨는지 알 수 있을까요?
제가 옛날에 GCP에서 제공할때 했었을때는 sparkoperator-spark로 하면 executor pod를 잘 생성 했었는데
이번에 다시 해보려고 하니까 계속 driver pod까지는 생성이되는데 executor pod가 생성이 안되어서요,,,
보시면 답변 부탁드리겠습니다 ㅜㅜ !!