Führen Sie Spark-Anwendungen mit Docker mithilfe von Amazon EMR 6.x aus - 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.

Führen Sie Spark-Anwendungen mit Docker mithilfe von Amazon EMR 6.x aus

Mit Amazon EMR 6.0.0 können Spark-Anwendungen Docker-Container verwenden, um ihre Bibliotheksabhängigkeiten zu definieren, anstatt Abhängigkeiten auf den einzelnen Amazon EC2 EC2-Instances im Cluster zu installieren. Wenn Sie Spark mit Docker ausführen möchten, müssen Sie zunächst die Docker-Registrierung konfigurieren und beim Senden einer Spark-Anwendung zusätzliche Parameter definieren. Weitere Informationen finden Sie unter Konfigurieren der Docker-Integration.

Wenn die Anwendung gesendet wird, ruft YARN Docker auf, um das angegebene Docker-Image abzurufen und die Spark-Anwendung in einem Docker-Container auszuführen. Auf diese Weise können Sie Abhängigkeiten einfach definieren und isolieren. Es reduziert die Zeit für das Bootstrapping oder die Vorbereitung von Instances im Amazon EMR-Cluster mit den Bibliotheken, die für die Auftragsausführung benötigt werden.

Überlegungen beim Ausführen von Spark mit Docker

Stellen Sie beim Ausführen von Spark mit Docker sicher, dass die folgenden Voraussetzungen erfüllt sind:

  • Das docker-Paket und die CLI werden nur auf Kern- und Aufgabenknoten installiert.

  • Auf Amazon EMR 6.1.0 und höher können Sie Docker alternativ mithilfe der folgenden Befehle auf einem Masterknoten installieren.

    • sudo yum install -y docker sudo systemctl start docker
  • Derspark-submit Befehl sollte immer von einer Master-Instance auf dem Amazon EMR-Cluster ausgeführt werden.

  • Die Docker-Register, die zum Auflösen von Docker-Images verwendet werden, müssen mithilfe der Klassifikations-API mit dem container-executor-Klassifizierungsschlüssel definiert werden, um beim Starten des Clusters zusätzliche Parameter zu definieren:

    • docker.trusted.registries

    • docker.privileged-containers.registries

  • Wenn Sie eine Spark-Anwendung in einem Docker-Container ausführen möchten, sind die folgenden Konfigurationsoptionen erforderlich:

    • YARN_CONTAINER_RUNTIME_TYPE=docker

    • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

  • Wenn Sie Amazon ECR zum Abrufen von Docker-Images verwenden, müssen Sie den Cluster so konfigurieren, dass er sich selbst authentifiziert. Dazu müssen Sie die folgende Konfigurationsoption verwenden:

    • YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG= {DOCKER_CLIENT_CONFIG_PATH_ON_HDFS}

  • In EMR 6.1.0 und höher müssen Sie den aufgelisteten Befehl nicht verwenden,YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS} wenn die auto ECR-Authentifizierungsfunktion aktiviert ist.

  • Bei jedem Docker-Image, das mit Spark verwendet wird, muss Java im Docker-Image installiert sein.

Weitere Informationen zu den Voraussetzungen finden Sie unter Docker-Integration konfigurieren.

Erstellen eines Docker-Image

Docker-Images werden mit einer Docker-Datei erstellt, in der die Pakete und die Konfiguration definiert werden, die in das Image aufgenommen werden sollen. Die folgenden beiden Beispiele verwenden Dockerfiles PySpark und SparkR.

PySpark Docker-Datei

Docker-Images, die aus diesem Dockerfile erstellt wurden, beinhalten Python 3 und das NumPy Python-Paket. Diese Docker-Datei verwendet Amazon Linux 2 und Amazon Corretto JDK 8.

FROM amazoncorretto:8 RUN yum -y update RUN yum -y install yum-utils RUN yum -y groupinstall development RUN yum list python3* RUN yum -y install python3 python3-dev python3-pip python3-virtualenv RUN python -V RUN python3 -V ENV PYSPARK_DRIVER_PYTHON python3 ENV PYSPARK_PYTHON python3 RUN pip3 install --upgrade pip RUN pip3 install numpy pandas RUN python3 -c "import numpy as np"

SparkR-Docker-Datei

Docker-Images, die aus dieser Docker-Datei erstellt werden, enthalten R und das CRAN-Paket „randomForest“. Diese Docker-Datei enthält Amazon Linux 2 und Amazon Corretto JDK 8.

FROM amazoncorretto:8 RUN java -version RUN yum -y update RUN amazon-linux-extras install R4 RUN yum -y install curl hostname #setup R configs RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile RUN Rscript -e "install.packages('randomForest')"

Weitere Informationen zur Docker-Dateisyntax finden Sie in der Docker-Datei-Referenzdokumentation.

Docker-Images aus Amazon ECR verwenden

Amazon Elastic Container Registry (Amazon ECR) ist eine vollständig verwaltete Docker-Container-Registry, mit deren Hilfe einfach das Speichern, Verwalten und Bereitstellen von Docker-Container-Images. Wenn Sie Amazon ECR verwenden, muss der Cluster so konfiguriert sein, dass er Ihrer ECR-Instance vertraut, und Sie müssen die Authentifizierung konfigurieren, damit der Cluster Docker-Images von Amazon ECR verwenden kann. Weitere Informationen finden Sie unter Konfigurieren von YARN für den Zugriff auf Amazon ECR.

Um sicherzustellen, dass EMR-Hosts auf die in Amazon ECR gespeicherten Bilder zugreifen können, muss Ihr Cluster über die Berechtigungen derAmazonEC2ContainerRegistryReadOnly Richtlinie verfügen, die dem Instance-Profil zugeordnet ist. Weitere Informationen finden Sie unter AmazonEC2ContainerRegistryReadOnly-Richtlinie.

In diesem Beispiel muss der Cluster mit der folgenden zusätzlichen Konfiguration erstellt werden, um sicherzustellen, dass die Amazon ECR-Registrierung vertrauenswürdig ist. Ersetzen Sie den 123456789123.dkr.ecr.us-east-1.amazonaws.com -Endpunkt durch Ihren Amazon ECR-Endpunkt.

[ { "Classification": "container-executor", "Configurations": [ { "Classification": "docker", "Properties": { "docker.trusted.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com", "docker.privileged-containers.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com" } } ] } ]

Verwendung PySpark mit Amazon ECR

Das folgende Beispiel verwendet das PySpark Dockerfile, das mit einem Tag versehen und in Amazon ECR hochgeladen wird. Nachdem das Dockerfile hochgeladen wurde, können Sie den PySpark Job ausführen und auf das Docker-Image von Amazon ECR verweisen.

Nachdem Sie den Cluster gestartet haben, verwenden Sie SSH, um eine Verbindung zu einem Kernknoten herzustellen, und führen Sie die folgenden Befehle aus, um das lokale Docker-Image aus dem PySpark Dockerfile-Beispiel zu erstellen.

Erstellen Sie zunächst ein Verzeichnis und eine Docker-Datei.

mkdir pyspark vi pyspark/Dockerfile

Fügen Sie den Inhalt des PySpark Dockerfiles ein und führen Sie die folgenden Befehle aus, um ein Docker-Image zu erstellen.

sudo docker build -t local/pyspark-example pyspark/

Erstellen Sie das emr-docker-examples-ECR-Repository für die Beispiele.

aws ecr create-repository --repository-name emr-docker-examples

Markieren Sie das vor Ort erstellte Image und laden Sie es in ECR hoch, indem Sie 123456789123.dkr.ecr.us-east-1.amazonaws.com durch Ihren ECR-Endpunkt ersetzen.

sudo docker tag local/pyspark-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example

Verwenden Sie SSH, um eine Verbindung mit dem Master-Knoten herzustellen und ein Python-Skript mit dem Dateinamen „main.py“ vorzubereiten. Fügen Sie den folgenden Inhalt in die main.py-Datei ein und speichern Sie sie.

from pyspark.sql import SparkSession spark = SparkSession.builder.appName("docker-numpy").getOrCreate() sc = spark.sparkContext import numpy as np a = np.arange(15).reshape(3, 5) print(a)

Geben Sie in EMR 6.0.0 den Namen des Docker-Images an, um den Job zu senden. Definieren Sie die zusätzlichen Konfigurationsparameter, um sicherzustellen, dass die Aufgabenausführung Docker als Laufzeit verwendet. Wenn Sie Amazon ECR verwenden,YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG müssen sie auf dieconfig.json Datei verweisen, die die Anmeldeinformationen enthält, die für die Authentifizierung bei Amazon ECR verwendet wurden.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --num-executors 2 \ main.py -v

Geben Sie in EMR 6.1.0 und höher den Namen des Docker-Images an, um den Job einzureichen. Führen Sie den folgenden Befehl aus, wenn die auto ECR-Authentifizierung aktiviert ist.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --num-executors 2 \ main.py -v

Wenn der Job abgeschlossen ist, notieren Sie sich die YARN-Anwendungs-ID und verwenden Sie den folgenden Befehl, um die Ausgabe des PySpark Jobs abzurufen.

yarn logs --applicationId application_id | grep -C2 '\[\[' LogLength:55 LogContents: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]

SparkR mit Amazon ECR verwenden

Im folgenden Beispiel wird die SparkR-Docker-Datei verwendet, die markiert und in ECR hochgeladen wird. Sobald das Dockerfile hochgeladen ist, können Sie den SparkR-Job ausführen und auf das Docker-Image von Amazon ECR verweisen.

Nachdem Sie den Cluster gestartet haben, verwenden Sie SSH, um eine Verbindung mit einem Core-Knoten herzustellen, und führen Sie die folgenden Befehle aus, um das lokale Docker-Image aus dem Beispiel für die SparkR-Docker-Datei zu erstellen.

Erstellen Sie zunächst ein Verzeichnis und die Docker-Datei.

mkdir sparkr vi sparkr/Dockerfile

Fügen Sie den Inhalt der SparkR-Docker-Datei ein, und führen Sie die folgenden Befehle aus, um ein Docker-Image zu erstellen.

sudo docker build -t local/sparkr-example sparkr/

Taggen Sie das lokal erstellte Image und laden Sie es auf Amazon ECR hoch. Ersetzen Sie 123456789123.dkr.ecr.us-east-1.amazonaws.com durch Ihren Amazon ECR-Endpunkt.

sudo docker tag local/sparkr-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example

Verwenden Sie SSH, um eine Verbindung zum Master-Knoten herzustellen und ein R-Skript mit dem Namen „sparkR.R“ vorzubereiten. Fügen Sie den folgenden Inhalt in die sparkR.R-Datei ein:

library(SparkR) sparkR.session(appName = "R with Spark example", sparkConfig = list(spark.some.config.option = "some-value")) sqlContext <- sparkRSQL.init(spark.sparkContext) library(randomForest) # check release notes of randomForest rfNews() sparkR.session.stop()

Verwenden Sie in EMR 6.0.0 den Namen des Docker-Images, um den Job zu senden. Definieren Sie die zusätzlichen Konfigurationsparameter, um sicherzustellen, dass die Aufgabenausführung Docker als Laufzeit verwendet. Wenn Sie Amazon ECR verwenden,YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG müssen sie auf dieconfig.json Datei verweisen, die die Anmeldeinformationen enthält, die für die Authentifizierung bei ECR verwendet wurden.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ sparkR.R

Geben Sie in EMR 6.1.0 und höher den Namen des Docker-Images an, um den Job einzureichen. Wenn die auto ECR-Authentifizierung aktiviert ist, führen Sie den folgenden Befehl aus.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ sparkR.R

Wenn die Aufgabe abgeschlossen ist, notieren Sie sich die YARN-Anwendungs-ID, und verwenden Sie den folgenden Befehl, um die Ausgabe der SparkR-Aufgabe abzurufen. Dieses Beispiel enthält Tests, um sicherzustellen, dass die randomForest-Bibliothek, die installierte Version und die Versionshinweise verfügbar sind.

yarn logs --applicationId application_id | grep -B4 -A10 "Type rfNews" randomForest 4.6-14 Type rfNews() to see new features/changes/bug fixes. Wishlist (formerly TODO): * Implement the new scheme of handling classwt in classification. * Use more compact storage of proximity matrix. * Allow case weights by using the weights in sampling? ======================================================================== Changes in 4.6-14: