Amazon EMR on EKS에서 Apache Spark의 사용자 지정 스케줄러로 Volcano 사용
Amazon EMR on EKS을 사용하면 Spark 운영자 또는 spark-submit을 사용하여 Kubernetes 사용자 지정 스케줄러로 Spark 작업을 실행할 수 있습니다. 이 자습서에서는 사용자 지정 대기열에서 Volcano 스케줄러를 통해 Spark 작업을 실행하는 방법을 다룹니다.
개요
Volcano
Volcano 설치 및 설정
-
아키텍처 요구 사항에 따라 다음 kubectl 명령 중 하나를 선택하여 Volcano를 설치합니다.
# x86_64 kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/v1.5.1/installer/volcano-development.yaml # arm64: kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/v1.5.1/installer/volcano-development-arm64.yaml
-
샘플 Volcano 대기열을 준비합니다. 대기열은 PodGroups
의 모음입니다. 대기열은 FIFO를 따르며 리소스 분할의 기반이 됩니다. cat << EOF > volcanoQ.yaml apiVersion: scheduling.volcano.sh/v1beta1 kind: Queue metadata: name: sparkqueue spec: weight: 4 reclaimable: false capability: cpu: 10 memory: 20Gi EOF kubectl apply -f volcanoQ.yaml
-
Amazon S3에 샘플 PodGroup 매니페스트를 업로드합니다. PodGroup은 연결 관계가 강력한 포드 그룹입니다. 일반적으로 배치 예약에 PodGroup을 사용합니다. 이전 단계에서 정의한 대기열에 다음 샘플 PodGroup을 제출합니다.
cat << EOF > podGroup.yaml apiVersion: scheduling.volcano.sh/v1beta1 kind: PodGroup spec: # Set minMember to 1 to make a driver pod minMember: 1 # Specify minResources to support resource reservation. # Consider the driver pod resource and executors pod resource. # The available resources should meet the minimum requirements of the Spark job # to avoid a situation where drivers are scheduled, but they can't schedule # sufficient executors to progress. minResources: cpu: "1" memory: "1Gi" # Specify the queue. This defines the resource queue that the job should be submitted to. queue: sparkqueue EOF aws s3 mv podGroup.yaml s3://
bucket-name
Spark 운영자를 사용하여 Volcano 스케줄러에서 Spark 애플리케이션을 실행합니다.
-
아직 실행하지 않았다면, 다음 단계를 완료하여 설정합니다.
-
helm install spark-operator-demo
명령을 실행할 때 다음 인수를 포함합니다.--set batchScheduler.enable=true --set webhook.enable=true
-
batchScheduler
가 구성된SparkApplication
정의 파일spark-pi.yaml
을 생성합니다.apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi namespace: spark-operator spec: type: Scala mode: cluster image: "895885662937.dkr.ecr.
us-west-2
.amazonaws.com/spark/emr-6.10.0:latest
" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar" sparkVersion: "3.3.1" batchScheduler: "volcano" #Note: You must specify the batch scheduler name as 'volcano' restartPolicy: type: Never volumes: - name: "test-volume
" hostPath: path: "/tmp" type: Directory driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.3.1 serviceAccount: emr-containers-sa-spark volumeMounts: - name: "test-volume
" mountPath: "/tmp" executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.3.1 volumeMounts: - name: "test-volume
" mountPath: "/tmp" -
다음 명령을 사용하여 Spark 애플리케이션을 제출합니다. 이렇게 하면
spark-pi
라고 하는SparkApplication
객체도 생성됩니다.kubectl apply -f spark-pi.yaml
-
다음 명령을 사용하여
SparkApplication
객체에 대한 이벤트를 확인합니다.kubectl describe pods spark-pi-driver --namespace spark-operator
첫 번째 포드 이벤트는 Volcano에서 해당 포드를 예약했음을 보여줍니다.
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23s volcano Successfully assigned default/spark-pi-driver to integration-worker2
spark-submit
을 사용하여 Volcano 스케줄러에서 Spark 애플리케이션 실행
-
먼저, Amazon EMR on EKS에서 spark-submit 설정 섹션에 나온 단계를 완료합니다. Volcano 지원을 통해
spark-submit
배포를 구축해야 합니다. 자세한 내용은 Apache Spark 설명서에서 Using Volcano as Customized Scheduler for Spark on Kubernetes의 Build section을 참조하세요. -
다음과 같은 환경 변수의 값을 설정합니다.
export SPARK_HOME=spark-home export MASTER_URL=k8s://
Amazon-EKS-cluster-endpoint
-
다음 명령을 사용하여 Spark 애플리케이션을 제출합니다.
$SPARK_HOME/bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master $MASTER_URL \ --conf spark.kubernetes.container.image=895885662937.dkr.ecr.
us-west-2
.amazonaws.com/spark/emr-6.10.0:latest
\ --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \ --deploy-mode cluster \ --conf spark.kubernetes.namespace=spark-operator \ --conf spark.kubernetes.scheduler.name=volcano \ --conf spark.kubernetes.scheduler.volcano.podGroupTemplateFile=/path/to/podgroup-template.yaml \ --conf spark.kubernetes.driver.pod.featureSteps=org.apache.spark.deploy.k8s.features.VolcanoFeatureStep \ --conf spark.kubernetes.executor.pod.featureSteps=org.apache.spark.deploy.k8s.features.VolcanoFeatureStep \ local:///usr/lib/spark/examples/jars/spark-examples.jar 20 -
다음 명령을 사용하여
SparkApplication
객체에 대한 이벤트를 확인합니다.kubectl describe pod spark-pi --namespace spark-operator
첫 번째 포드 이벤트는 Volcano에서 해당 포드를 예약했음을 보여줍니다.
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23s volcano Successfully assigned default/spark-pi-driver to integration-worker2