Uso de Volcano como programador personalizado para Apache Spark en Amazon EMR en EKS - Amazon EMR

Uso de Volcano como programador personalizado para Apache Spark en Amazon EMR en EKS

Con Amazon EMR en EKS, puede usar el operador de Spark o spark-submit para ejecutar trabajos de Spark con los programadores personalizados de Kubernetes. Este tutorial explica cómo ejecutar trabajos de Spark con un programador de Volcano en una cola personalizada.

Información general

Volcano puede ayudar a administrar la programación de Spark con funciones avanzadas, como la programación de colas, la programación de reparto equitativo y la reserva de recursos. Para obtener más información sobre las ventajas de Volcano, consulte Por qué Spark elige Volcano como programador de lotes integrado en Kubernetes en el blog de CNCF de The Linux Foundation.

Instalar y configurar Volcano

  1. Elija uno de los siguientes comandos kubectl para instalar Volcano, en función de sus necesidades arquitectónicas:

    # 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. Prepare un ejemplo de cola de Volcano. Una cola es un grupo de PodGroups. La cola adopta FIFO y es la base de la división de recursos.

    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. Cargue un manifiesto de PodGroup de muestra en Amazon S3. PodGroup es un grupo de pods con una fuerte asociación. Por lo general, un PodGroup se utiliza para la programación por lotes. Envíe el siguiente PodGroup de muestra a la cola que definió en el paso anterior.

    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

Ejecute una aplicación de Spark con el programador de Volcano con el operador de Spark

  1. Si aún no lo ha hecho, complete los pasos de las secciones siguientes para configurarlo todo:

    1. Instalar y configurar Volcano

    2. Configuración del operador de Spark para Amazon EMR en EKS

    3. Instalar el operador de Spark

      Cuando ejecute el comando helm install spark-operator-demo, incluya los siguientes argumentos:

      --set batchScheduler.enable=true --set webhook.enable=true
  2. Cree un archivo de definición spark-pi.yaml de SparkApplication con batchScheduler configurado.

    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. Envíe la aplicación de Spark con el siguiente comando. Esto también crea un objeto SparkApplication llamado spark-pi:

    kubectl apply -f spark-pi.yaml
  4. Compruebe los eventos del objeto SparkApplication con el siguiente comando:

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

    El primer evento de pod mostrará que Volcano ha programado los pods:

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

Ejecute una aplicación de Spark con el programador de Volcano con spark-submit

  1. En primer lugar, complete los pasos de la sección Configuración de spark-submit para Amazon EMR en EKS. Debe crear su distribución spark-submit con el soporte de Volcano. Para obtener más información, consulte la sección Crear de Cómo usar Volcano como programador personalizado para Spark en Kubernetes de la documentación de Apache Spark.

  2. Establezca los valores de las siguientes variables de entorno:

    export SPARK_HOME=spark-home export MASTER_URL=k8s://Amazon-EKS-cluster-endpoint
  3. Envíe la aplicación de Spark con el siguiente comando:

    $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. Compruebe los eventos del objeto SparkApplication con el siguiente comando:

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

    El primer evento de pod mostrará que Volcano ha programado los pods:

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