

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

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

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

## 개요
개요

[Volcano](https://volcano.sh/en/)는 대기열 예약, 공정 공유 예약, 리소스 예약과 같은 고급 기능을 통해 Spark 예약을 관리하는 데 도움을 줄 수 있습니다. Volcano의 이점에 대한 자세한 내용은 Linux Foundation의 *CNCF 블로그*에서 [Why Spark chooses Volcano as built-in batch scheduler on Kubernetes](https://www.cncf.io/blog/2022/06/30/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
   ```

1. 샘플 Volcano 대기열을 준비합니다. 대기열은 [PodGroups](https://volcano.sh/en/docs/podgroup/)의 모음입니다. 대기열은 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
   ```

1. 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 애플리케이션을 실행합니다.
제출: Spark 운영자

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

   1. [Volcano 설치 및 설정](#tutorial-volcano-install)

   1. [Amazon EMR on EKS에 대한 Spark 운영자 구성](spark-operator-setup.md)

   1. [Spark 운영자 설치](spark-operator-gs.md#spark-operator-install)

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

      ```
      --set batchScheduler.enable=true 
      --set webhook.enable=true
      ```

1. `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"
   ```

1. 다음 명령을 사용하여 Spark 애플리케이션을 제출합니다. 이렇게 하면 `spark-pi`라고 하는 `SparkApplication` 객체도 생성됩니다.

   ```
   kubectl apply -f spark-pi.yaml
   ```

1. 다음 명령을 사용하여 `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 애플리케이션 실행
제출: `spark-submit`

1. 먼저, [Amazon EMR on EKS에서 spark-submit 설정](spark-submit-setup.md) 섹션에 나온 단계를 완료합니다. Volcano 지원을 통해 `spark-submit` 배포를 구축해야 합니다. 자세한 내용은 *Apache Spark 설명서*에서 [Using Volcano as Customized Scheduler for Spark on Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html#build)의 **Build section**을 참조하세요.

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

   ```
   export SPARK_HOME=spark-home
   export MASTER_URL=k8s://Amazon-EKS-cluster-endpoint
   ```

1. 다음 명령을 사용하여 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
   ```

1. 다음 명령을 사용하여 `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
   ```