Wie passen Sie Docker-Images an - 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.

Wie passen Sie Docker-Images an

Gehen Sie wie folgt vor, um Docker-Images für Amazon EMR on EKS anzupassen. Die Schritte zeigen Ihnen, wie Sie ein Basis-Image abrufen, es anpassen und veröffentlichen und mithilfe des Images einen Workload einreichen.

Anmerkung

Andere Optionen, die Sie bei der Anpassung von Docker-Images in Betracht ziehen sollten, sind die Anpassung für interaktive Endpunkte, um sicherzustellen, dass Sie über die erforderlichen Abhängigkeiten verfügen, oder die Verwendung von Container-Images mit mehreren Architekturen:

Voraussetzungen

Schritt 1: Rufen Sie ein Basis-Image aus Amazon Elastic Container Registry (AmazonECR) ab

Das Basis-Image enthält die EMR Amazon-Laufzeit und Konnektoren, die für den Zugriff auf andere AWS Dienste verwendet werden. Für Amazon EMR 6.9.0 und höher können Sie die Basisbilder aus der Amazon ECR Public Gallery abrufen. Durchsuchen Sie die Galerie nach dem Image-Link und laden Sie das Image in Ihren lokalen Workspace. Für die Amazon-Version EMR 7.2.0 erhalten Sie beispielsweise mit dem folgenden docker pull Befehl das neueste Standard-Basis-Image. Sie können durch emr-7.2.0:latest ersetzen, emr-7.2.0-spark-rapids:latest um das Image abzurufen, das über den RAPIDS Nvidia-Beschleuniger verfügt. Sie können auch emr-7.2.0:latest durch emr-7.2.0-java11:latest ersetzen, um das Image mit der Java-11-Laufzeit abzurufen.

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.2.0:latest

Wenn Sie das Basis-Image für Amazon EMR 6.9.0 oder frühere Versionen abrufen möchten oder wenn Sie es vorziehen, es von ECR Amazon-Registrierungskonten in jeder Region abzurufen, gehen Sie wie folgt vor:

  1. Wählen Sie ein Basis-Image aus. URI Das Bild URI folgt diesem FormatECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag, wie das folgende Beispiel zeigt.

    895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

    Informationen zur Auswahl eines Basis-Images in Ihrer Region finden Sie unter Einzelheiten zur Auswahl eines Basis-Images URI.

  2. Melden Sie sich beim ECR Amazon-Repository an, in dem das Basis-Image gespeichert ist. Ersetzen 895885662937 and us-west-2 mit dem ECR Amazon-Registrierungskonto und der AWS Region, die Sie ausgewählt haben.

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
  3. Ziehen Sie das Basis-Image in Ihren lokalen Workspace. Ersetzen emr-6.6.0:latest mit dem von Ihnen ausgewählten Container-Image-Tag.

    docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

Schritt 2: Ein Basis-Image anpassen

Gehen Sie wie folgt vor, um das Basis-Image, das Sie von Amazon abgerufen haben, anzupassenECR.

  1. Erstellen Sie ein neues Dockerfile in Ihrem lokalen Workspace.

  2. Bearbeiten Sie die soeben von Ihnen erstellte Dockerfile und fügen Sie die folgenden Inhalte hinzu. Dabei wird das Container-Image Dockerfile verwendet, das Sie aus 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest abgerufen haben.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root ### Add customization commands here #### USER hadoop:hadoop
  3. Fügen Sie Befehle in Dockerfile hinzu, um das Basis-Image anzupassen. Fügen Sie beispielsweise einen Befehl zur Installation von Python-Bibliotheken hinzu, wie im Folgenden Dockerfile gezeigt wird.

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root RUN pip3 install --upgrade boto3 pandas numpy // For python 3 USER hadoop:hadoop
  4. Führen Sie in demselben Verzeichnis, in dem Dockerfile erstellt wurde, den folgenden Befehl aus, um das Docker-Image zu erstellen. Geben Sie einen Namen für das Docker-Image ein, zum Beispiel emr6.6_custom.

    docker build -t emr6.6_custom .

Schritt 3: (Optional, aber empfohlen) Ein benutzerdefiniertes Image validieren

Wir empfehlen Ihnen, die Kompatibilität Ihres benutzerdefinierten Images zu testen, bevor Sie es veröffentlichen. Sie können das EKSbenutzerdefinierte EMR Amazon-Image verwendenCLI, um zu überprüfen, ob Ihr Image die erforderlichen Dateistrukturen und die richtigen Konfigurationen für die Ausführung EMR auf Amazon hatEKS.

Anmerkung

Das EKS benutzerdefinierte Bild von EMR Amazon CLI kann nicht bestätigen, dass Ihr Bild fehlerfrei ist. Seien Sie vorsichtig, wenn Sie Abhängigkeiten von den Basis-Images entfernen.

Führen Sie den folgenden Befehl aus, um Ihre Aufgaben zu löschen.

  1. Laden Sie Amazon EMR auf einem EKS benutzerdefinierten Image herunter und installieren Sie esCLI. Weitere Informationen finden Sie EMRim Amazon on EKS Custom Image CLI Installation Guide.

  2. Führen Sie den folgenden Befehl aus, um die Installation zu testen.

    emr-on-eks-custom-image --version

    Hier ein Beispiel für die Ausgabe.

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. Führen Sie den folgenden Befehl aus, um Ihre Ressourcen zu löschen.

    emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
    • -igibt das lokale Image anURI, das validiert werden muss. Dies kann das BildURI, ein beliebiger Name oder ein Tag sein, den Sie für Ihr Bild definiert haben.

    • -r gibt die genaue Release-Version für das Basis-Image an, zum Beispiel emr-6.6.0-latest.

    • -t gibt den Imagetyp an. Wenn es sich um ein Image-Bild handelt, geben Sie spark ein. Der Standardwert ist spark. Die aktuelle Amazon EMR on EKS Custom CLI Image-Version unterstützt nur Spark-Runtime-Images.

    Wenn Sie den Befehl erfolgreich ausführen und das benutzerdefinierte Image alle erforderlichen Konfigurationen und Dateistrukturen erfüllt, werden in der zurückgegebenen Ausgabe die Ergebnisse aller Tests angezeigt, wie das folgende Beispiel zeigt.

    Amazon EMR on EKS Custom Image Test Version: x.xx ... Checking if docker cli is installed ... Checking Image Manifest [INFO] Image ID: xxx [INFO] Created On: 2021-05-17T20:50:07.986662904Z [INFO] Default User Set to hadoop:hadoop : PASS [INFO] Working Directory Set to /home/hadoop : PASS [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: PASS [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS [INFO] File Structure Test for bin-files in /usr/bin: PASS ... Start Running Sample Spark Job [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS ----------------------------------------------------------------- Overall Custom Image Validation Succeeded. -----------------------------------------------------------------

    Wenn das benutzerdefinierte Image die erforderlichen Konfigurationen oder Dateistrukturen nicht erfüllt, treten Fehlermeldungen auf. Die zurückgegebene Ausgabe enthält Informationen zu den falschen Konfigurationen oder Dateistrukturen.

Schritt 4: Ein benutzerdefiniertes Image veröffentlichen

Veröffentlichen Sie das neue Docker-Image in Ihrer ECR Amazon-Registrierung.

  1. Führen Sie den folgenden Befehl aus, um ein ECR Amazon-Repository zum Speichern Ihres Docker-Images zu erstellen. Geben Sie einen Namen für Ihr Repository an, zum Beispiel emr6.6_custom_repo. Ersetzen us-west-2 mit deiner Region.

    aws ecr create-repository \ --repository-name emr6.6_custom_repo \ --image-scanning-configuration scanOnPush=true \ --region us-west-2

    Weitere Informationen finden Sie unter Erstellen eines Repositorys im ECRAmazon-Benutzerhandbuch.

  2. Führen Sie den folgenden Befehl aus, um Ihre Ressourcen zu löschen.

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com

    Weitere Informationen finden Sie unter Authentifizieren Sie sich bei Ihrer Standardregistrierung im ECRAmazon-Benutzerhandbuch.

  3. Taggen und veröffentlichen Sie ein Bild in dem von Ihnen erstellten ECR Amazon-Repository.

    Markieren Sie das Image.

    docker tag emr6.6_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    Übertragen Sie das Image per Push.

    docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    Weitere Informationen finden Sie unter Ein Bild an Amazon ECR senden im ECRAmazon-Benutzerhandbuch.

Schritt 5: Reichen Sie einen Spark-Workload EMR mit einem benutzerdefinierten Image bei Amazon ein

Nachdem ein benutzerdefiniertes Image erstellt und veröffentlicht wurde, können Sie mithilfe eines benutzerdefinierten Images ein EMR EKS Amazon-On-Job einreichen.

Erstellen Sie zunächst eine start-job-run -request.json-Datei und geben Sie den spark.kubernetes.container.image Parameter an, der auf das benutzerdefinierte Bild verweisen soll, wie die folgende JSON Beispieldatei zeigt.

Anmerkung

Sie können local:// das Schema verwenden, um auf Dateien zu verweisen, die im benutzerdefinierten Bild verfügbar sind, wie im folgenden Codeausschnitt mit dem entryPoint Argument gezeigt. JSON Sie können das local://-Schema auch verwenden, um auf Anwendungsabhängigkeiten zu verweisen. Alle Dateien und Abhängigkeiten, auf die mithilfe des local://-Schemas verwiesen wird, müssen bereits im angegebenen Pfad im benutzerdefinierten Image vorhanden sein.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } }

Sie können das benutzerdefinierte Image auch mit applicationConfiguration-Eigenschaften referenzieren, wie das folgende Beispiel zeigt.

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } ] } }

Führen Sie dann den start-job-run-Befehl aus, um den Auftrag zu senden.

aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json

Ersetzen Sie in den obigen JSON Beispielen emr-6.6.0-latest mit Ihrer EMR Amazon-Release-Version. Wir empfehlen dringend, die -latest Release-Version zu verwenden, um sicherzustellen, dass die ausgewählte Version die neuesten Sicherheitsupdates enthält. Weitere Informationen zu EMR Amazon-Release-Versionen und ihren Image-Tags finden Sie unterEinzelheiten zur Auswahl eines Basis-Images URI.

Anmerkung

Sie können spark.kubernetes.driver.container.image und spark.kubernetes.executor.container.image verwenden, um ein anderes Image für Treiber- und Executor-Pods anzugeben.