

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan Volcano sebagai penjadwal khusus untuk Apache Spark di Amazon EMR di EKS
<a name="tutorial-volcano"></a>

Dengan Amazon EMR di EKS, Anda dapat menggunakan operator Spark atau spark-submit untuk menjalankan pekerjaan Spark dengan penjadwal kustom Kubernetes. Tutorial ini mencakup cara menjalankan pekerjaan Spark dengan penjadwal Volcano pada antrian khusus.

## Ikhtisar
<a name="tutorial-volcano-overview"></a>

[Volcano](https://volcano.sh/en/) dapat membantu mengelola penjadwalan Spark dengan fungsi-fungsi lanjutan seperti penjadwalan antrian, penjadwalan berbagi adil, dan reservasi sumber daya. *Untuk informasi lebih lanjut tentang manfaat Volcano, lihat [Mengapa Spark memilih Volcano sebagai penjadwal batch bawaan di Kubernetes di](https://www.cncf.io/blog/2022/06/30/why-spark-chooses-volcano-as-built-in-batch-scheduler-on-kubernetes/) blog CNCF The Linux Foundation.* 

## Instal dan atur Volcano
<a name="tutorial-volcano-install"></a>

1. Pilih salah satu perintah kubectl berikut untuk menginstal Volcano, tergantung pada kebutuhan arsitektur Anda:

   ```
   # 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. Siapkan contoh antrian Volcano. Antrian adalah kumpulan. [PodGroups](https://volcano.sh/en/docs/podgroup/) Antrian mengadopsi FIFO dan merupakan dasar untuk pembagian sumber daya.

   ```
   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. Unggah contoh PodGroup manifes ke Amazon S3. PodGroup adalah sekelompok pod dengan asosiasi yang kuat. Anda biasanya menggunakan penjadwalan PodGroup untuk batch. Kirimkan sampel berikut PodGroup ke antrian yang Anda tentukan di langkah sebelumnya.

   ```
   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
   ```

## Jalankan aplikasi Spark dengan penjadwal Volcano dengan operator Spark
<a name="tutorial-volcano-sparkoperator"></a>

1. Jika Anda belum melakukannya, selesaikan langkah-langkah di bagian berikut untuk menyiapkan:

   1. [Instal dan atur Volcano](#tutorial-volcano-install)

   1. [Menyiapkan operator Spark untuk Amazon EMR di EKS](spark-operator-setup.md)

   1. [Instal operator Spark](spark-operator-gs.md#spark-operator-install)

      Sertakan argumen berikut saat Anda menjalankan `helm install spark-operator-demo` perintah:

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

1. Buat file `SparkApplication` definisi `spark-pi.yaml` dengan `batchScheduler` dikonfigurasi. 

   ```
   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. Kirim aplikasi Spark dengan perintah berikut. Ini juga menciptakan `SparkApplication` objek yang disebut`spark-pi`:

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

1. Periksa peristiwa untuk `SparkApplication` objek dengan perintah berikut: 

   ```
   kubectl describe pods spark-pi-driver --namespace spark-operator
   ```

   Acara pod pertama akan menunjukkan bahwa Volcano telah menjadwalkan pod:

   ```
   Type    Reason     Age   From                Message
   ----    ------     ----  ----                -------
   Normal  Scheduled  23s   volcano             Successfully assigned default/spark-pi-driver to integration-worker2
   ```

## Jalankan aplikasi Spark dengan penjadwal Volcano dengan `spark-submit`
<a name="tutorial-volcano-sparksubmit"></a>

1. Pertama, selesaikan langkah-langkah di [Menyiapkan spark-submit untuk Amazon EMR di EKS](spark-submit-setup.md) bagian ini. Anda harus membangun `spark-submit` distribusi Anda dengan dukungan Volcano. *Untuk informasi selengkapnya, lihat **bagian Build** dari [Using Volcano as Customized Scheduler for Spark on Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html#build) di dokumentasi Apache Spark.*

1. Tetapkan nilai untuk variabel lingkungan berikut:

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

1. Kirim aplikasi Spark dengan perintah berikut:

   ```
   $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. Periksa peristiwa untuk `SparkApplication` objek dengan perintah berikut: 

   ```
   kubectl describe pod spark-pi --namespace spark-operator
   ```

   Acara pod pertama akan menunjukkan bahwa Volcano telah menjadwalkan pod:

   ```
   Type    Reason     Age   From                Message
   ----    ------     ----  ----                -------
   Normal  Scheduled  23s   volcano             Successfully assigned default/spark-pi-driver to integration-worker2
   ```