Exécution d’applications Spark avec Docker sur Amazon EMR 6.x - 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.

Exécution d’applications Spark avec Docker sur Amazon EMR 6.x

Avec Amazon EMR 6.0.0, les applications Spark peuvent utiliser des conteneurs Docker pour définir les dépendances de leurs bibliothèques, au lieu d'installer des dépendances sur les EC2 instances Amazon individuelles du cluster. Pour exécuter Spark avec Docker, vous devez d'abord configurer le registre Docker et définir des paramètres supplémentaires lors de la soumission d'une application Spark. Pour plus d'informations, consultez Configuration de l'intégration Docker.

Lorsque l'application est soumise, YARN appelle Docker pour extraire l'image Docker spécifiée et exécuter l'application Spark dans un conteneur Docker. Cette approche vous permet de définir et d'isoler facilement les dépendances. Elle réduit le temps d'amorçage ou de préparation des instances dans le cluster Amazon EMR avec les bibliothèques nécessaires à l'exécution des tâches.

Considérations lors de l'exécution de Spark avec Docker

Lorsque vous exécutez Spark avec Docker, assurez-vous que les conditions suivantes sont remplies :

  • Le package docker et l'interface de ligne de commande ne sont installés que sur les nœuds principaux et de tâche.

  • Sur Amazon EMR 6.1.0 et versions ultérieures, vous pouvez également installer Docker sur un nœud primaire à l'aide des commandes suivantes.

    • sudo yum install -y docker sudo systemctl start docker
  • La commande spark-submit doit toujours être exécutée à partir d'une instance principale sur le cluster Amazon EMR.

  • Les registres Docker utilisés pour résoudre les images Docker doivent être définis à l'aide de l'API Classification avec la clé de classification container-executor pour définir des paramètres supplémentaires lors du lancement du cluster :

    • docker.trusted.registries

    • docker.privileged-containers.registries

  • Pour exécuter une application Spark dans un conteneur Docker, les options de configuration suivantes sont nécessaires :

    • YARN_CONTAINER_RUNTIME_TYPE=docker

    • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

  • Lorsque vous utilisez Amazon ECR pour récupérer des images Docker, vous devez configurer le cluster pour qu'il s'authentifie. Pour ce faire, vous devez utiliser l'option de configuration suivante :

    • YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS}

  • Dans Amazon EMR 6.1.0 et versions ultérieures, vous n’êtes pas obligé d’utiliser la commande répertoriée YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS} lorsque la fonctionnalité d’authentification automatique ECR est activée.

  • Toute image Docker utilisée avec Spark implique l'installation préalable de Java dans l'image Docker.

Pour plus d'informations sur les conditions préalables, consultez Configuration de l'intégration de Docker.

Création d'une image Docker

Les images Docker sont créées à l'aide d'un Dockerfile, qui définit les packages et la configuration à inclure dans l'image. Les deux exemples suivants utilisent Dockerfiles et PySpark SparkR.

PySpark Dockerfile

Les images Docker créées à partir de ce Dockerfile incluent Python 3 et le package Python NumPy . Ce Dockerfile utilise Amazon Linux 2 et le kit JDK Amazon Corretto 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"

Dockerfile SparkR

Les images Docker créées à partir de ce Dockerfile incluent R et le package RandomForest CRAN. Ce Dockerfile comprend Amazon Linux 2 et le kit JDK Amazon Corretto 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')"

Pour plus d'informations sur la syntaxe Dockerfile, consultez la documentation de référence relative à Dockerfile.

Utilisation d'images Docker depuis Amazon ECR

Amazon Elastic Container Registry (Amazon ECR) est un registre de conteneurs Docker entièrement géré qui permet de stocker, de gérer et de déployer facilement les images des conteneurs Docker. Lors de l'utilisation d'Amazon ECR, le cluster doit être configuré pour faire confiance à votre instance d'ECR. Vous devez, par ailleurs, configurer l'authentification pour que le cluster utilise les images Docker à partir d'Amazon ECR. Pour plus d'informations, consultez Configuration de YARN pour accéder à Amazon ECR.

Pour vous assurer que les hôtes Amazon EMR ont accès aux images stockées dans Amazon ECR, vérifiez que votre cluster dispose des autorisations de la politique AmazonEC2ContainerRegistryReadOnly associée au profil d’instance. Pour de plus amples informations, veuillez consulter Stratégie AmazonEC2ContainerRegistryReadOnly.

Dans cet exemple, le cluster doit être créé avec la configuration supplémentaire suivante pour s'assurer que le registre Amazon ECR est approuvé. Remplacez le 123456789123.dkr.ecr.us-east-1.amazonaws.com point de terminaison par votre point de terminaison Amazon ECR.

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

Utilisation PySpark avec Amazon ECR

L'exemple suivant utilise le PySpark Dockerfile, qui sera balisé et chargé sur Amazon ECR. Après avoir chargé le Dockerfile, vous pouvez exécuter la PySpark tâche et vous référer à l'image Docker depuis Amazon ECR.

Après avoir lancé le cluster, utilisez SSH pour vous connecter à un nœud principal et exécutez les commandes suivantes pour créer l'image Docker locale à partir de l'exemple PySpark Dockerfile.

Tout d'abord, créez un répertoire et un fichier Dockerfile.

mkdir pyspark vi pyspark/Dockerfile

Collez le contenu du PySpark Dockerfile et exécutez les commandes suivantes pour créer une image Docker.

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

Créez le référentiel ECR emr-docker-examples pour les exemples.

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

Marquez et téléchargez l'image créée localement sur ECR, en la remplaçant par votre point de 123456789123.dkr.ecr.us-east-1.amazonaws.com terminaison ECR.

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

Utilisez SSH pour vous connecter au nœud primaire et préparez un script Python dont le nom de fichier est main.py. Collez le contenu suivant dans le fichier main.py et enregistrez-le.

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)

Sur Amazon EMR 6.0.0, indiquez le nom de l’image Docker pour soumettre la tâche. Définissez les paramètres de configuration supplémentaires pour vous assurer que l'exécution de la tâche utilise Docker comme environnement d'exécution. Lors de l'utilisation d'Amazon ECR, YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG doit référencer le fichier config.json contenant les informations d'identification utilisées pour s'authentifier auprès d'Amazon ECR.

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

Sur Amazon EMR 6.1.0 et versions ultérieures, indiquez le nom de l’image Docker pour soumettre la tâche. Lorsque l'authentification automatique ECR est activée, veuillez exécuter la commande suivante.

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

Lorsque la tâche est terminée, prenez note de l'ID de l'application YARN et utilisez la commande suivante pour obtenir le résultat de la PySpark tâche.

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]]

Utilisation de SparkR avec Amazon ECR

L'exemple suivant utilise le fichier Dockerfile SparkR, qui sera balisé et chargé dans ECR. Une fois le fichier Dockerfile chargé, vous pouvez exécuter la tâche SparkR et vous référer à l'image Docker à partir d'Amazon ECR.

Après avoir lancé le cluster, utilisez SSH pour vous connecter à un nœud principal et exécutez les commandes suivantes pour générer l'image Docker locale à partir de l'exemple de Dockerfile SparkR.

Tout d'abord, créez un répertoire et un fichier Dockerfile.

mkdir sparkr vi sparkr/Dockerfile

Collez le contenu du fichier Dockerfile SparkR et exécutez les commandes suivantes pour créer une image Docker.

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

Marquez et téléchargez l'image créée localement sur Amazon ECR, en la remplaçant par votre point de 123456789123.dkr.ecr.us-east-1.amazonaws.com terminaison Amazon ECR.

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

Utilisez SSH pour vous connecter au nœud primaire et préparer un script R avec le nom sparkR.R. Collez le contenu suivant dans le fichier sparkR.R.

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()

Sur Amazon EMR 6.0.0, indiquez le nom de l’image Docker pour soumettre la tâche. Définissez les paramètres de configuration supplémentaires pour vous assurer que l'exécution de la tâche utilise Docker comme environnement d'exécution. Lors de l'utilisation d'Amazon ECR, YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG doit référencer le fichier config.json contenant les informations d'identification utilisées pour s'authentifier auprès d'ECR.

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

Sur Amazon EMR 6.1.0 et versions ultérieures, indiquez le nom de l’image Docker pour soumettre la tâche. Lorsque l'authentification automatique ECR est activée, exécutez la commande suivante.

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

Lorsque la tâche est terminée, prenez note de l'ID de l'application YARN et utilisez la commande suivante pour obtenir la sortie de la tâche SparkR. Cet exemple inclut des tests permettant de vérifier que la bibliothèque randomForest, la version installée et les notes de mise à jour sont disponibles.

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: