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가 생성이 안되어서요,,,
보시면 답변 부탁드리겠습니다 ㅜㅜ !!