Utilisation de la mise à l'échelle automatique verticale avec l'opérateur Spark pour Amazon sur EMR EKS - Amazon EMR

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de la mise à l'échelle automatique verticale avec l'opérateur Spark pour Amazon sur EMR EKS

À partir d'Amazon EMR 7.0, vous pouvez utiliser Amazon EMR sur la mise à l'échelle automatique EKS verticale pour simplifier la gestion des ressources. Il ajuste automatiquement la mémoire et CPU les ressources pour s'adapter aux besoins de la charge de travail que vous fournissez aux applications Amazon EMR Spark. Pour de plus amples informations, veuillez consulter Utilisation de la mise à l'échelle automatique verticale avec les tâches Spark sur Amazon EMR.

Cette section décrit comment configurer l'opérateur Spark pour utiliser l'autoscaling vertical.

Prérequis

Avant de continuer, assurez-vous d'effectuer les configurations suivantes :

  • Suivez les étapes de Configuration de l'opérateur Spark pour Amazon EMR sur EKS.

  • (Facultatif) Si vous avez déjà installé une ancienne version de l'opérateur Spark, supprimez le SparkApplication/ScheduledSparkApplication CRD.

    kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
  • Suivez les étapes de Installation de l'opérateur Spark. À l'étape 3, ajoutez la ligne suivante à la commande d'installation pour autoriser les webhooks pour l'opérateur :

    --set webhook.enable=true
  • Suivez les étapes de Configuration de la mise à l'échelle automatique verticale pour Amazon EMR on EKS.

  • Donnez accès aux fichiers dans votre emplacement Amazon S3 :

    1. Annotez le compte de service de votre chauffeur et de votre opérateur avec JobExecutionRole les autorisations 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. Mettez à jour la politique de confiance de votre rôle d'exécution des tâches dans cet espace de noms.

      aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
    3. Modifiez la politique de confiance des IAM rôles de votre rôle d'exécution des tâches et mettez à jour le emr-containers-sa-spark-*-*-xxxx formulaire serviceaccount versemr-containers-sa-*.

      { "Effect": "Allow", "Principal": { "Federated": "OIDC-provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*" } } }
    4. Si vous utilisez Amazon S3 comme espace de stockage de fichiers, ajoutez les valeurs par défaut suivantes à votre fichier 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

Exécuter une tâche avec l'autoscaling vertical sur l'opérateur Spark

Pour pouvoir exécuter une application Spark à l'aide de l'opérateur Spark, vous devez suivre les étapes indiquées dans Prérequis.

Pour utiliser la mise à l'échelle automatique verticale avec l'opérateur Spark, ajoutez la configuration suivante au pilote correspondant aux spécifications de votre application Spark afin d'activer la mise à l'échelle automatique verticale :

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

Cette configuration permet l'autoscaling vertical et constitue une configuration de signature obligatoire qui vous permet de choisir une signature pour votre tâche.

Pour plus d'informations sur les configurations et les valeurs des paramètres, consultez Configuration de l'autoscaling vertical pour Amazon EMR sur EKS. Par défaut, votre tâche est soumise en mode Désactivé, réservé à la surveillance uniquement, de la mise à l'échelle automatique verticale. Cet état de surveillance vous permet de calculer et de consulter les recommandations en matière de ressources sans procéder à la mise à l'échelle automatique. Pour plus d'informations, consultez la section Modes de mise à l'échelle automatique verticaux.

Voici un exemple de fichier de SparkApplication définition nommé spark-pi.yaml avec les configurations requises pour utiliser l'autoscaling 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"

Maintenant, soumettez l'application Spark à l'aide de la commande suivante. Cela créera également un objet SparkApplication nommé spark-pi :

kubectl apply -f spark-pi.yaml

Pour plus d'informations sur l'envoi d'applications à Spark via l'opérateur Spark, consultez la section Utiliser un SparkApplication dans la spark-on-k8s-operator documentation sur GitHub.

Vérification de la fonctionnalité de mise à l'échelle automatique verticale

Pour vérifier que la mise à l'échelle automatique verticale fonctionne correctement pour la tâche soumise, utilisez kubectl pour obtenir la ressource personnalisée verticalpodautoscaler et consulter vos recommandations de mise à l'échelle.

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

Le résultat de cette requête devrait ressembler à ce qui suit :

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

Si votre résultat ne ressemble pas à cela ou contient un code d'erreur, consultez Résolution des problèmes de mise à l'échelle automatique verticale d'Amazon EMR on EKS pour des étapes permettant de résoudre le problème.

Pour supprimer les modules et les applications, exécutez la commande suivante :

kubectl delete sparkapplication spark-pi