Verwenden Sie vertikale Autoskalierung mit dem Spark-Operator für Amazon EMR auf EKS - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden Sie vertikale Autoskalierung mit dem Spark-Operator für Amazon EMR auf EKS

Ab Amazon EMR 7.0 können Sie Amazon EMR für EKS vertikale Autoscaling verwenden, um das Ressourcenmanagement zu vereinfachen. Speicher und CPU Ressourcen werden automatisch an die Anforderungen der Arbeitslast angepasst, die Sie für Amazon EMR Spark-Anwendungen bereitstellen. Weitere Informationen finden Sie unter Verwenden von vertikaler Autoskalierung mit Amazon EMR Spark-Jobs.

In diesem Abschnitt wird beschrieben, wie Sie den Spark-Operator für die Verwendung des vertikalen Auto Scalings konfigurieren.

Voraussetzungen

Bevor Sie fortfahren, müssen Sie die folgenden Einstellungen ausführen:

  • Führen Sie die Schritte unter Einrichtung des Spark-Operators für Amazon EMR auf EKS aus.

  • (Optional) Wenn Sie zuvor eine ältere Version des Spark-Operators installiert haben, löschen Sie den SparkApplication/ScheduledSparkApplication CRD.

    kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
  • Führen Sie die Schritte unter Den Spark-Operator installieren aus. Fügen Sie in Schritt 3 dem Installationsbefehl die folgende Zeile hinzu, um Webhooks für den Operator zuzulassen:

    --set webhook.enable=true
  • Führen Sie die Schritte unter Vertikales Autoscaling für Amazon EMR einrichten am EKS aus.

  • Gewähren Sie Zugriff auf die Dateien an Ihrem Amazon S3 S3-Standort:

    1. Vermerken Sie Ihr Fahrer- und Betreiber-Servicekonto mit demJobExecutionRole, das über S3-Berechtigungen verfügt.

      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. Aktualisieren Sie die Vertrauensrichtlinie Ihrer Jobausführungsrolle in diesem Namespace.

      aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
    3. Bearbeiten Sie die IAM Rollenvertrauensrichtlinie Ihrer Jobausführungsrolle und aktualisieren Sie das Feld serviceaccount von emr-containers-sa-spark-*-*-xxxx bisemr-containers-sa-*.

      { "Effect": "Allow", "Principal": { "Federated": "OIDC-provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*" } } }
    4. Wenn Sie Amazon S3 als Dateispeicher verwenden, fügen Sie Ihrer Yaml-Datei die folgenden Standardeinstellungen hinzu.

      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

Einen Auftrag mit vertikalem Auto Scaling auf dem Spark-Operator ausführen

Bevor Sie eine Spark-Anwendung mit dem Spark-Operator ausführen können, führen Sie die Schritte unter Voraussetzungen durch.

Um vertikales Autoscaling mit dem Spark-Operator zu verwenden, fügen Sie dem Treiber für Ihre Spark-Anwendungsspezifikation die folgende Konfiguration hinzu, um das vertikale Autoscaling zu aktivieren:

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

Diese Konfiguration ermöglicht vertikales Autoscaling und ist eine erforderliche Signaturkonfiguration, mit der Sie eine Signatur für Ihren Job auswählen können.

Weitere Informationen zu den Konfigurationen und Parameterwerten finden Sie unter Configuring vertical autoscaling for Amazon EMR on EKS. Standardmäßig wird Ihr Auftrag beim vertikalen Auto Scaling im Modus Nur für Überwachung aus gesendet. In diesem Überwachungsstatus können Sie Ressourcenempfehlungen berechnen und anzeigen, ohne ein Auto Scaling durchführen zu müssen. Weitere Informationen finden Sie unter Vertikale Autoscaling-Modi.

Im Folgenden finden Sie eine SparkApplication Beispieldefinitionsdatei spark-pi.yaml mit dem Namen der erforderlichen Konfigurationen für die Verwendung der vertikalen Autoskalierung.

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"

Senden Sie jetzt die Spark-Anwendung mit dem folgenden Befehl. Dadurch wird auch ein SparkApplication-Objekt mit dem spark-pi-Namen erstellt:

kubectl apply -f spark-pi.yaml

Weitere Informationen zum Einreichen von Anwendungen an Spark über den Spark-Operator finden Sie unter Using a SparkApplication in der spark-on-k8s-operator Dokumentation zu GitHub.

Überprüfen der vertikalen Auto-Scaling-Funktionalität

Um zu überprüfen, ob das vertikale Auto Scaling für den eingereichten Auftrag korrekt funktioniert, rufen Sie mit kubectl die benutzerdefinierte verticalpodautoscaler-Ressource ab und sehen Sie sich Ihre Skalierungsempfehlungen an.

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

Die Ausgabe dieser Abfrage sollte wie folgt aussehen:

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

Wenn Ihre Ausgabe nicht ähnlich aussieht oder einen Fehlercode enthält, finden Sie weitere Schritte zur Behebung des Problems in Problembehebung bei Amazon EMR bei EKS vertikaler Autoskalierung.

Führen Sie den folgenden Befehl aus, um die Pods und Anwendungen zu entfernen:

kubectl delete sparkapplication spark-pi