Serveur d'impression

Simplifiez votre gestion des dépendances Spark avec Docker dans EMR 6.0.0: idk.dev – Bien choisir son serveur d impression

Le 2 mai 2020 - 12 minutes de lecture

Apache Spark est un puissant moteur de traitement de données qui fournit aux équipes d'analystes de données et d'ingénierie des API et des outils faciles à utiliser pour analyser leurs données, mais il peut être difficile pour les équipes de gérer leurs dépendances de bibliothèque Python et R. L'installation de chaque dépendance dont un travail peut avoir besoin avant son exécution et la gestion des conflits de version de bibliothèque prend du temps et est compliquée. Amazon EMR 6.0.0 simplifie cela en vous permettant d'utiliser des images Docker à partir de Docker Hub et Amazon ECR pour empaqueter vos dépendances. Cela vous permet de regrouper et de gérer vos dépendances pour des travaux Spark ou des blocs-notes individuels, sans avoir à gérer une toile d'araignée de dépendances sur votre cluster.

Cet article vous montre comment utiliser Docker pour gérer les dépendances des ordinateurs portables avec Amazon EMR 6.0.0 et EMR Notebooks. Vous allez lancer un cluster EMR 6.0.0 et utiliser des images Docker spécifiques à un ordinateur portable d'Amazon ECR avec votre ordinateur portable EMR.

Création d'une image Docker

La première étape consiste à créer une image Docker contenant Python 3 et la dernière version du engourdi Paquet Python. Vous créez des images Docker à l'aide d'un Dockerfile, qui définit les packages et la configuration à inclure dans l'image. Les images Docker utilisées avec Amazon EMR 6.0.0 doivent contenir un kit de développement Java (JDK); le Dockerfile suivant utilise Amazon Linux 2 et Amazon Corretto JDK 8:

D'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

RUN python3 -c "import numpy as np"

Vous allez utiliser ce Dockerfile pour créer une image Docker, puis la baliser et la télécharger sur Amazon ECR. Après l'avoir téléchargé, vous lancerez un cluster EMR 6.0.0 configuré pour utiliser cette image Docker comme image par défaut pour les travaux Spark. Effectuez les étapes suivantes pour créer, étiqueter et télécharger votre image Docker:

  1. Créez un répertoire et un nouveau fichier nommé Dockerfile en utilisant les commandes suivantes:
    $ mkdir pyspark-latest
    $ vi pyspark-latest / Dockerfile
  2. Copiez, puis collez le contenu du Dockerfile, enregistrez-le et exécutez la commande suivante pour créer une image Docker:
    $ docker build -t 'local / pyspark-latest' pyspark-latest /
  3. Créez le emr-docker-examples Référentiel Amazon ECR pour cette procédure pas à pas à l'aide de la commande suivante:
    $ aws ecr create-repository --repository-name emr-docker-examples
  4. Balisez l'image construite localement et remplacez 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de terminaison Amazon ECR, à l'aide de la commande suivante:
    $ docker tag local / pyspark-latest 123456789123.dkr.ecr.us-east-1.amazonaws.com / emr-docker-examples: pyspark-latest

    Avant de pouvoir envoyer l'image Docker vers Amazon ECR, vous devez vous connecter.

  5. Pour obtenir la ligne de connexion de votre compte Amazon ECR, utilisez la commande suivante:
    $ aws ecr get-login --region us-east-1 --no-include-email
  6. Entrez et exécutez la sortie du get-login commander:
    $ docker login -u AWS -p <mot de passe> https: //123456789123.dkr.ecr.us-east-1.amazonaws.com 
  7. Téléchargez l'image construite localement sur Amazon ECR et remplacez 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de terminaison Amazon ECR. Voir la commande suivante:
    $ docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/ emr-docker-examples: pyspark-latest

Une fois cette transmission terminée, l'image Docker peut être utilisée avec votre cluster EMR.

Lancement d'un cluster EMR 6.0.0 avec Docker activé

Pour utiliser Docker avec Amazon EMR, vous devez lancer votre cluster EMR avec la prise en charge de l'exécution Docker activée et avoir la bonne configuration en place pour vous connecter à votre compte Amazon ECR. Pour permettre à votre cluster de télécharger des images à partir d'Amazon ECR, assurez-vous que le profil d'instance de votre cluster dispose des autorisations de la AmazonEC2ContainerRegistryReadOnly politique gérée qui lui est associée. La configuration de la première étape ci-dessous configure votre cluster EMR 6.0.0 pour utiliser Amazon ECR pour télécharger des images Docker et configure Apache Livy et Apache Spark pour utiliser le pyspark-latest Image Docker comme image Docker par défaut pour tous les travaux Spark. Effectuez les étapes suivantes pour lancer votre cluster:

  1. Créez un fichier nommé emr-configuration.json dans le répertoire local avec la configuration suivante (remplacez 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de terminaison Amazon ECR):
    [
       
          "Classification": "conteneur-exécuteur",
          "Propriétés":
    
          ,
          "Configurations":[
             
                "Classification": "docker",
                "Propriétés":
                   "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"
               
             
          ],
       
          "Classification": "livy-conf",
          "Propriétés":
             "livy.spark.master": "fil",
             "livy.spark.deploy-mode": "cluster",
             "livy.server.session.timeout": "16h"
          
       ,
       
          "Classification": "ruche-site",
          "Propriétés":
             "hive.execution.mode": "conteneur"
          
       ,
       
          "Classification": "spark-defaults",
          "Propriétés":
             "spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE": "docker",
             "spark.yarn.am.waitTime": "300s",
             "spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE": "docker",
             "spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG": "hdfs: ///user/hadoop/config.json",
             "spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE": "123456789123.dkr.ecr.us-east-1.amazonaws.com/ emr-docker-examples: pyspark-latest ",
             "spark.executor.instances": "2",
             "spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG": "hdfs: ///user/hadoop/config.json",
             "spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE": "123456789123.dkr.ecr.us-east-1.amazonaws.com/ emr-docker-examples: pyspark-latest "
          
       
    ]

    Vous utiliserez cette configuration pour lancer votre cluster EMR 6.0.0 à l'aide de l'AWS CLI.

  2. Entrez les commandes suivantes (remplacez ma clé avec le nom de la paire de clés EC2 que vous utilisez pour accéder au cluster à l'aide de SSH, et subnet-1234567 avec l'ID de sous-réseau dans lequel le cluster doit être lancé):
    aws emr create-cluster
    --name 'EMR 6.0.0 avec Docker'
    --release-label emr-6.0.0
    --applications Nom = Livy Nom = Spark
    --ec2-attributes "KeyName =ma clé, SubnetId =subnet-1234567"
    --instance-type m5.xlarge --instance-count 3
    --use-default-roles
    - fichier de configuration: //./emr-configuration.json

    Une fois le cluster lancé et se trouve dans le Attendre , assurez-vous que les hôtes du cluster peuvent s'authentifier auprès d'Amazon ECR et télécharger des images Docker.

  3. Utilisez votre paire de clés EC2 pour SSH dans l'un des nœuds principaux du cluster.
  4. Pour générer la commande Docker CLI pour créer les informations d'identification (valides pendant 12 heures) que le cluster utilise pour télécharger des images Docker à partir d'Amazon ECR, entrez la commande suivante:
    $ aws ecr get-login --region us-east-1 --no-include-email
  5. Entrez et exécutez la sortie du get-login commander:
    $ sudo docker login -u AWS -p <mot de passe> https: //123456789123.dkr.ecr.us-east-1.amazonaws.com 

    Cette commande génère un config.json fichier dans le /root/.docker dossier.

  6. Placer le généré config.json fichier à l'emplacement HDFS / user / hadoop / en utilisant la commande suivante:
    $ sudo hdfs dfs -put /root/.docker/config.json / user / hadoop /

Maintenant que vous avez un cluster EMR configuré avec Docker et une image dans Amazon ECR, vous pouvez utiliser les ordinateurs portables EMR pour créer et exécuter votre ordinateur portable.

Création d'un ordinateur portable EMR

Les blocs-notes EMR sont des blocs-notes Jupyter sans serveur disponibles directement via la console Amazon EMR. Ils vous permettent de séparer votre environnement de bloc-notes de votre infrastructure de cluster sous-jacente et d'accéder à votre bloc-notes sans passer de temps à configurer l'accès SSH ou à configurer votre navigateur pour la redirection de port. Vous pouvez trouver des ordinateurs portables EMR dans la navigation de gauche de la console EMR.

Pour créer votre bloc-notes, procédez comme suit:

  1. Cliquer sur Des cahiers dans le Console EMR
  2. Choisissez un nom pour votre ordinateur portable
  3. Cliquez sur Choisissez un cluster existant et sélectionnez le cluster que vous venez de créer
  4. Cliquez sur Créer un cahier
  5. Une fois que votre ordinateur portable est en état Prêt, vous pouvez cliquer sur le Ouvrir dans JupyterLab pour l'ouvrir dans un nouvel onglet du navigateur. Un bloc-notes par défaut avec le nom de votre bloc-notes EMR est créé par défaut. Lorsque vous cliquez sur ce bloc-notes, vous serez invité à choisir un noyau. Choisir PySpark.
  6. Entrez la configuration suivante dans la première cellule de votre bloc-notes et cliquez sur ▸ (Exécuter):
    %% configure -f
    "conf": "spark.pyspark.virtualenv.enabled": "false"
  7. Saisissez le code PySpark suivant dans votre bloc-notes et cliquez sur ▸ (Exécuter):
    de pyspark.sql importation SparkSession
    spark = SparkSession.builder.appName ("docker-numpy"). getOrCreate ()
    sc = spark.sparkContext
    
    import numpy as np
    a = np.arange (15) .reshape (3, 5)
    imprimer (a)
    imprimer (np .__ version__)

La sortie devrait ressembler à la capture d'écran suivante; la version numpy utilisée est la plus récente (au moment de la rédaction de ce document, 1.18.2).

Ce code PySpark a été exécuté sur votre cluster EMR 6.0.0 à l'aide de YARN, Docker et du pyspark-latest l'image que vous avez créée. Les ordinateurs portables EMR se connectent aux clusters EMR à l'aide d'Apache Livy. La configuration spécifiée dans emr-configuration.json configuré les instances Spark et Livy de votre cluster EMR pour utiliser Docker et pyspark-latest Image Docker comme image Docker par défaut pour tous les travaux Spark soumis à ce cluster. Cela vous permet d'utiliser engourdi sans avoir à l'installer sur des nœuds de cluster. La section suivante explique comment créer et utiliser différentes images Docker pour des blocs-notes spécifiques.

Utilisation d'une image Docker personnalisée pour un ordinateur portable spécifique

Les charges de travail individuelles nécessitent souvent des versions spécifiques des dépendances de bibliothèque. Pour permettre à chaque bloc-notes d'utiliser ses propres images Docker, vous devez d'abord créer une nouvelle image Docker et la pousser vers Amazon ECR. Vous configurez ensuite votre ordinateur portable pour utiliser cette image Docker au lieu de l'image par défaut pyspark-latest image.

Effectuez les étapes suivantes:

  1. Créer un nouveau Dockerfile avec une version spécifique de engourdi: 1.17.5.
    D'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 == 1.17.5'
    
    RUN python3 -c "import numpy as np"
  2. Créez un répertoire et un nouveau fichier nommé Dockerfile en utilisant les commandes suivantes:
    $ mkdir numpy-1-17
    $ vi numpy-1-17 / Dockerfile
  3. Entrez le contenu de votre nouveau Dockerfile et le code suivant pour créer une image Docker:
    $ docker build -t 'local / numpy-1-17' numpy-1-17 /
  4. Marquer et télécharger l'image construite localement sur Amazon ECR et remplacer 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de terminaison Amazon ECR à l'aide des commandes suivantes:
    $ docker tag local / numpy-1-17 123456789123.dkr.ecr.us-east-1.amazonaws.com/ emr-docker-examples: numpy-1-17
    $ docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/ emr-docker-examples: numpy-1-17

    Maintenant que l'image Docker numpy-1-17 est disponible dans Amazon ECR, vous pouvez l'utiliser avec un nouveau bloc-notes.

  1. Créez un nouveau bloc-notes en revenant à votre bloc-notes EMR et cliquez sur Fichier, nouveau, bloc-noteset choisissez le PySpark Pour indiquer à votre ordinateur portable EMR d'utiliser cette image Docker spécifique au lieu de l'image par défaut, vous devez utiliser les paramètres de configuration suivants.
  1. Entrez le code suivant dans votre carnet (remplacez 123456789123.dkr.ecr.us-east-1.amazonaws.com avec votre point de terminaison Amazon ECR) et choisissez ▸ (Exécuter):
        %% configure -f
    "conf":
     
      "spark.pyspark.virtualenv.enabled": "faux",
      "spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE": "123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:numpy-1-17",
      "spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE": "123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:numpy-1-17"
     
    

    Pour vérifier si votre code PySpark utilise la version 1.17.5, entrez le même code PySpark qu'avant pour utiliser numpy et sortir la version.

  1. Entrez le code suivant dans votre carnet et choisissez Courir:
    de pyspark.sql importation SparkSession
    spark = SparkSession.builder.appName ("docker-numpy"). getOrCreate ()
    sc = spark.sparkContext
    
    import numpy as np
    a = np.arange (15) .reshape (3, 5)
    imprimer (a)
    imprimer (np .__ version__)

La sortie devrait ressembler à la capture d'écran suivante; la version numpy utilisée est la version que vous avez installée sur votre numpy-1-17 Image Docker: 1.17.5.

Sommaire

Cet article vous a montré comment simplifier votre gestion des dépendances Spark à l'aide d'Amazon EMR 6.0.0 et de Docker. Vous avez créé une image Docker pour empaqueter vos dépendances Python, créé un cluster configuré pour utiliser Docker et utilisé cette image Docker avec un bloc-notes EMR pour exécuter des travaux PySpark. Pour en savoir plus sur l'utilisation d'images Docker avec EMR, consultez la documentation EMR sur la façon d'exécuter des applications Spark avec Docker à l'aide d'Amazon EMR 6.0.0. Restez à l'écoute pour des mises à jour supplémentaires sur les nouvelles fonctionnalités et d'autres améliorations avec Apache Spark sur Amazon EMR.


A propos de l'auteur

Paul Codding est chef de produit senior pour EMR chez Amazon Web Services.

Suthan Phillips est un architecte Big Data chez AWS. Il travaille avec les clients pour leur fournir des conseils architecturaux et les aide à améliorer les performances des applications complexes sur Amazon EMR. Dans ses temps libres, il aime faire de la randonnée et explorer le nord-ouest du Pacifique.

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.