Uso del escalado automático vertical con el operador Spark para Amazon activado EMR EKS - Amazon EMR

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso del escalado automático vertical con el operador Spark para Amazon activado EMR EKS

A partir de Amazon EMR 7.0, puede usar Amazon EMR en el escalado automático EKS vertical para simplificar la administración de recursos. Ajusta automáticamente la memoria y CPU los recursos para adaptarlos a las necesidades de la carga de trabajo que usted proporciona a las aplicaciones de Amazon EMR Spark. Para obtener más información, consulte Uso del escalado automático vertical con trabajos de Spark de Amazon EMR.

En esta sección, se describe cómo configurar el operador de Spark para usar el escalado automático vertical.

Requisitos previos

Antes de seguir, asegúrese de completar la siguiente configuración:

  • Realice los pasos que se indican en Configuración del operador Spark para Amazon EMR en EKS.

  • (Opcional) Si anteriormente instaló una versión anterior del operador Spark, elimine la tecla SparkApplication/ScheduledSparkApplication CRD.

    kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
  • Realice los pasos que se indican en Instalar el operador de Spark. En el paso 3, agregue la siguiente línea al comando de instalación para admitir webhooks para el operador:

    --set webhook.enable=true
  • Realice los pasos que se indican en Configuración del escalado automático vertical de Amazon EMR en EKS.

  • Conceda acceso a los archivos de su ubicación de Amazon S3:

    1. Anota tu cuenta de servicio de conductor y operador con la JobExecutionRole que tenga permisos de S3.

      kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark eks.amazonaws.com/role-arn=JobExecutionRole kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark-operator eks.amazonaws.com/role-arn=JobExecutionRole
    2. Actualice la política de confianza de su función de ejecución de tareas en ese espacio de nombres.

      aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
    3. Edite la política de confianza de IAM roles de su rol de ejecución de tareas y actualice serviceaccount de aemr-containers-sa-spark-*-*-xxxx. emr-containers-sa-*

      { "Effect": "Allow", "Principal": { "Federated": "OIDC-provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*" } } }
    4. Si utiliza Amazon S3 como almacenamiento de archivos, añada los siguientes valores predeterminados a su archivo yaml.

      hadoopConf: # EMRFS filesystem fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate fs.s3.buffer.dir: /mnt/s3 fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000" mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2" mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true" sparkConf: # Required for EMR Runtime spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native

Ejecutar un trabajo con escalado automático vertical en el operador de Spark

Para poder ejecutar una aplicación de Spark con el operador de Spark, complete los pasos indicados en Requisitos previos.

Para usar el escalado automático vertical con el operador Spark, añada la siguiente configuración al controlador según las especificaciones de su aplicación Spark para activar el escalado automático vertical:

dynamicSizing: mode: Off signature: "my-signature"

Esta configuración permite el escalado automático vertical y es una configuración de firma obligatoria que te permite elegir una firma para tu trabajo.

Para obtener más información sobre las configuraciones y los valores de los parámetros, consulte Configuración del escalado automático vertical para Amazon EMR on EKS. De forma predeterminada, su trabajo se envía en el modo Desactivado de escalado automático vertical solo de supervisión. Este estado de supervisión le permite calcular y ver las recomendaciones de recursos sin llevar a cabo el escalado automático. Para obtener más información, consulte Modos de escalado automático vertical.

El siguiente es un ejemplo de archivo de SparkApplication definición spark-pi.yaml con las configuraciones necesarias para usar el escalado automático vertical.

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-7.2.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar" sparkVersion: "3.4.1" dynamicSizing: mode: Off signature: "my-signature" restartPolicy: type: Never volumes: - name: "test-volume" hostPath: path: "/tmp" type: Directory driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.4.1 serviceAccount: emr-containers-sa-spark volumeMounts: - name: "test-volume" mountPath: "/tmp" executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.4.1 volumeMounts: - name: "test-volume" mountPath: "/tmp"

Luego, implemente la aplicación de Spark con el siguiente comando. Esto también creará un objeto SparkApplication denominado spark-pi:

kubectl apply -f spark-pi.yaml

Para obtener más información sobre cómo enviar solicitudes a Spark a través del operador de Spark, consulta Cómo usar un SparkApplication en la spark-on-k8s-operator documentación de. GitHub

Verificación de la funcionalidad de escalado automático vertical

Para comprobar que el escalado automático vertical funcione correctamente en el trabajo enviado, use kubectl para obtener el recurso personalizado verticalpodautoscaler y ver sus recomendaciones de escalado.

kubectl get verticalpodautoscalers --all-namespaces \ -l=emr-containers.amazonaws.com/dynamic.sizing.signature=my-signature

El resultado de esta consulta debe parecerse al siguiente:

NAMESPACE NAME MODE CPU MEM PROVIDED AGE spark-operator ds-p73j6mkosvc4xeb3gr7x4xol2bfcw5evqimzqojrlysvj3giozuq-vpa Off 580026651 True 15m

Si el resultado no es similar o contiene un código de error, consulte Solución de problemas en el escalado automático vertical de Amazon EMR en EKS para ver los pasos que le ayudarán a resolver el problema.

Para eliminar los pods y las aplicaciones, ejecuta el siguiente comando:

kubectl delete sparkapplication spark-pi