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

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. Cela réduit le temps de démarrage ou de préparation des instances dans le EMR cluster Amazon 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 docker package et les nœuds de tâches ne CLI sont installés que sur les nœuds principaux et les nœuds de tâches.

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

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

  • Les registres Docker utilisés pour résoudre les images Docker doivent être définis à l'aide de la classification API avec la clé de container-executor classification 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 HDFS _ON_}

  • 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 ECR automatique 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 Amazon Corretto 8. JDK

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 inclut Amazon Linux 2 et Amazon Corretto 8. JDK

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 provenant d'Amazon ECR

Amazon Elastic Container Registry (AmazonECR) est un registre de conteneurs Docker entièrement géré, qui facilite le stockage, la gestion et le déploiement d'images de conteneurs Docker. Lorsque vous utilisez AmazonECR, le cluster doit être configuré pour faire confiance à votre instance deECR, et vous devez configurer l'authentification pour que le cluster utilise les images Docker d'AmazonECR. Pour plus d'informations, consultez Configuration YARN pour accéder à Amazon ECR.

Pour garantir que les EMR hôtes Amazon peuvent accéder aux images stockées sur AmazonECR, votre cluster doit disposer des autorisations définies dans la AmazonEC2ContainerRegistryReadOnly politique 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 garantir la fiabilité ECR du registre Amazon. Remplacez le 123456789123.dkr.ecr.us-east-1.amazonaws.com point de terminaison avec votre point de ECR terminaison Amazon.

[ { "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 d'Amazon. ECR

Après avoir lancé le cluster, connectez-vous SSH à 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 emr-docker-examples ECR référentiel pour les exemples.

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

Marquez et téléchargez l'image créée localement versECR, en remplaçant 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre ECR terminal.

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

SSHUtilisez-le pour vous connecter au nœud principal et préparer un script Python avec le nom du fichiermain.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, pour soumettre la tâche, référencez le nom de l'image Docker. 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. Lorsque vous utilisez AmazonECR, vous YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG devez référencer le config.json fichier contenant les informations d'identification utilisées pour s'authentifier auprès d'AmazonECR.

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, pour soumettre la tâche, référencez le nom de l'image Docker. Lorsque l'authentification ECR automatique est activée, exécutez 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 le travail est terminé, prenez note de l'ID de l'YARNapplication et utilisez la commande suivante pour obtenir le résultat du PySpark travail.

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

Utiliser SparkR avec Amazon ECR

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

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

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 AmazonECR, en remplaçant 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de ECR terminaison Amazon.

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

SSHUtilisez-le pour vous connecter au nœud principal et préparer un script R portant le nomsparkR.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, pour soumettre la tâche, reportez-vous au nom de l'image Docker. 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. Lorsque vous utilisez AmazonECR, vous YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG devez vous référer au config.json fichier contenant les informations d'identification utilisées pour s'authentifier auprès deECR.

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, pour soumettre la tâche, référencez le nom de l'image Docker. Lorsque l'authentification ECR automatique 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, notez l'ID de l'YARNapplication et utilisez la commande suivante pour obtenir le résultat de la tâche SparkR. Cet exemple inclut des tests visant à s'assurer que la randomForest bibliothèque, la version installée et les notes de version 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: