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 の利点の詳細については、The 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. サンプルの PodGroup マニフェストを Amazon S3 にアップロードします。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 EMR on EKS での Spark 演算子のセットアップ

    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 Kubernetes」の「Build」セクションを参照してください。

  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