Amazon EMR on EKS에서 Apache Spark의 사용자 지정 스케줄러로 Volcano 사용 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon EMR on EKS에서 Apache Spark의 사용자 지정 스케줄러로 Volcano 사용

Amazon EMR on EKS을 사용하면 Spark 운영자 또는 spark-submit을 사용하여 Kubernetes 사용자 지정 스케줄러로 Spark 작업을 실행할 수 있습니다. 이 자습서에서는 사용자 지정 대기열에서 Volcano 스케줄러를 통해 Spark 작업을 실행하는 방법을 다룹니다.

개요

Volcano는 대기열 예약, 공정 공유 예약, 리소스 예약과 같은 고급 기능을 통해 Spark 예약을 관리하는 데 도움을 줄 수 있습니다. Volcano의 이점에 대한 자세한 내용은 Linux Foundation의 CNCF 블로그에서 Why Spark chooses Volcano as built-in batch scheduler on Kubernetes를 참조하세요.

Volcano 설치 및 설정

  1. 아키텍처 요구 사항에 따라 다음 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
  2. 샘플 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
  3. 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 애플리케이션을 실행합니다.

  1. 아직 실행하지 않았다면, 다음 단계를 완료하여 설정합니다.

    1. Volcano 설치 및 설정

    2. 에서 Amazon용 Spark 연산자 설정 EMR EKS

    3. Spark 운영자 설치

      helm install spark-operator-demo 명령을 실행할 때 다음 인수를 포함합니다.

      --set batchScheduler.enable=true --set webhook.enable=true
  2. 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"
  3. 다음 명령을 사용하여 Spark 애플리케이션을 제출합니다. 이렇게 하면 spark-pi라고 하는 SparkApplication 객체도 생성됩니다.

    kubectl apply -f spark-pi.yaml
  4. 다음 명령을 사용하여 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 애플리케이션 실행

  1. 먼저, Amazon EMR on EKS에서 spark-submit 설정 섹션에 나온 단계를 완료합니다. Volcano 지원을 통해 spark-submit 배포를 구축해야 합니다. 자세한 내용은 Apache Spark 설명서에서 Using Volcano as Customized Scheduler for Spark on KubernetesBuild section을 참조하세요.

  2. 다음과 같은 환경 변수의 값을 설정합니다.

    export SPARK_HOME=spark-home export MASTER_URL=k8s://Amazon-EKS-cluster-endpoint
  3. 다음 명령을 사용하여 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
  4. 다음 명령을 사용하여 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