Migrer les programmes Apache Spark vers AWS Glue - AWS Glue

Migrer les programmes Apache Spark vers AWS Glue

Apache Spark est une plateforme open source pour les charges de travail informatiques distribuées et exécutées sur de vastes jeux de données.AWS Glue tire parti des capacités de Spark pour fournir une expérience optimisée pour l'ETL. Vous pouvez migrer les programmes Spark vers AWS Glue afin de profiter de nos fonctionnalités.AWS Glue propose les mêmes améliorations de performances que vous êtes en droit d'attendre d'Apache Spark sur Amazon EMR.

Exécuter le code Spark

Le code Spark natif peut être exécuté dans un environnement AWS Glue dès la première utilisation. Les scripts sont souvent développés en modifiant une partie de code de manière itérative, afin d’offrir un flux de travail adapté à une session interactive. Toutefois, le code existant est plus adapté pour être exécuté dans une tâche AWS Glue, qui vous permet de planifier et d'obtenir des journaux et des métriques de manière régulière pour chaque exécution de script. Vous pouvez télécharger et modifier un script existant en utilisant la console.

  1. Obtenir la source de votre script. Pour besoin de cet exemple, vous utiliserez un exemple de script du référentiel Apache Spark. Exemple de binarizer

  2. Dans la Console AWS Glue, développez le volet de navigation de gauche et sélectionnez ETL > Tâches

    Dans le panneau Créer une tâche, sélectionnez Éditeur de script Spark. Une section Options apparaîtra. Dans cette section Options, sélectionnez Chargement et modification d'un script existant.

    Une section de Chargement du fichier apparaîtra. Dans cette section Chargement du fichier, cliquez sur Choisissez un fichier. Le sélecteur de fichiers de votre système s'affichera. Accédez à l'emplacement où vous avez enregistré binarizer_example.py, sélectionnez-le et confirmez votre choix.

    Une touche Créer apparaîtra dans l'en-tête du panneau Créer une tâche. Cliquez sur cette touche.

    La page des tâches AWS GlueStudio sera sélectionnée dans le volet de l'éditeur de script Spark.
  3. Votre navigateur accèdera à l'éditeur de script. Dans l'en-tête, cliquez sur l’onglet Détails de la tâche. Définissez le Nom et le Rôle IAM. Pour obtenir des conseils sur les rôles IAM AWS Glue, consultez Configuration des autorisations IAM pour AWS Glue.

    Facultativement, définissez le Nombre de travailleurs à 2 etle Nombre de nouvelles tentatives à 1. Ces options sont utiles lors de l'exécution de tâches de production. Cependant, leur désactivation simplifiera votre expérience lors du test d'une fonctionnalité.

    Dans la barre de titre, cliquez surEnregistrer, puis sur Exécuter

    La page des détails de la tâche contient les options définies comme indiquées.
  4. Accédez à l’onglet Exécutions. Vous verrez un panneau correspondant à l’exécution de votre tâche. Patientez quelques minutes, la page devrait s'actualiser automatiquement pour afficher Réussie comme Statut de l'exécution.

    La page exécute la tâche avec un statut d’exécution réussie.
  5. Si vous souhaitez examiner votre sortie pour vérifier que le script Spark s'est exécuté comme prévu. Cet échantillon de script Apache Spark doit écrire une chaîne dans le flux de sortie. Vous pouvez le trouver en accédant aux Journaux sous Cloudwatch logs dans le panneau, pour l'exécution de tâche réussie. Notez l'ID d'exécution de la tâche, un identifiant généré sous le modèle Id commençant parjr_.

    Cela ouvrira la console CloudWatch, configurée pour visualiser le contenu du AWS Gluegroupe de journaux/aws-glue/jobs/output par défaut, filtrés selon le contenu des flux de journaux pour l'ID d'exécution de la tâche. Chaque programme de travail aura généré un flux de journaux, affiché sous forme de lignes sous Flux de journaux. Un programme de travail aurait dû exécuter le code demandé. Vous devrez ouvrir tous les flux de journaux pour identifier le bon programme de travail. Une fois que vous avez trouvé le bon programme de travail, vous devriez voir la sortie du script, comme dans l'image suivante :

    La page de la console CloudWatch avec la sortie du programme Spark.

Procédures communes requises pour la migration des programmes Spark

Évaluation de la prise en charge de la version de Spark

La version AWS Glue détermine les versions d'Apache Spark et Python disponibles pour la tâche AWS Glue. Vous pouvez trouver nos versions AWS Glue, ainsi que les fonctionnalités qu'elles prennent en charge sur Versions AWS Glue. Vous devrez peut-être mettre à jour votre programme Spark pour qu'il soit compatible avec une version plus récente de Spark afin d'accéder à certaines fonctionnalités AWS Glue.

Intégration des bibliothèques tierces

De nombreux programmes Spark existants dépendront à la fois d'artefacts privés et publics.AWS Glue prend en charge les dépendances de style JAR pour les tâches Scala, ainsi que les dépendances Wheel et source Pure-Python pour les tâches Python.

Python - Pour plus d'informations sur les dépendances Python, consultez Utilisation des bibliothèques Python avec AWS Glue

Les dépendances Python courantes sont fournies dans l'environnement AWS Glue, ce qui comprend la bibliothèque Pandas fréquemment demandée. Les dépendances sont incluses dans la version 2.0 et les versions ultérieures de AWS Glue. Pour plus d'informations sur les modules fournis, consultez Modules Python déjà fournis dans AWS Glue. Si vous devez fournir à une tâche une version différente d'une dépendance incluse par défaut, vous pouvez utiliser --additional-python-modules. Pour plus d'informations sur ces arguments, consultez Utilisation des paramètres de tâche dans les tâches AWS Glue.

Vous pouvez fournir des dépendances Python supplémentaires avec l’argument de tâche --extra-py-files. Si vous migrez une tâche depuis un programme Spark, ce paramètre constitue une bonne option, car il est fonctionnellement équivalent à l'indicateur --py-files dans PySpark et il est soumis aux mêmes limitations. Pour plus d'informations sur le paramètre --extra-py-files, consultez Intégration de fichiers Python avec les fonctionnalités natives de PySpark

Pour les nouvelles tâches, vous pouvez gérer les dépendances Python avec l’argument de tâche --additional-python-modules. L'utilisation de cet argument offre une expérience plus profonde de la gestion des dépendances. Ce paramètre prend en charge les dépendances de style Wheel, y compris celles comprenant des liaisons de codes natifs compatibles avec Amazon Linux 2.

Scala

Vous pouvez fournir des dépendances Scala supplémentaires avec l’Argument de tâche --extra-jars. Les dépendances doivent être hébergées dans Amazon S3, et la valeur de l'argument doit être une liste de chemins non-espacés Amazon S3 délimités par des virgules. Vous pourriez juger plus facile de gérer votre configuration en regroupant vos dépendances avant de les héberger et de les configurer.AWS Glue Les dépendances JAR contiennent un bytecode Java, qui peut être généré à partir de n'importe quel langage JVM. Il vous est possible d’utiliser d'autres langages JVM, tels que Java, pour écrire des dépendances personnalisées.

Gestion des informations d'identification de la source de données

Les programmes Spark existants peuvent être fournis avec une configuration complexe ou personnalisée pour l’extraction des données de leurs sources de données. Les flux d'authentification de source de données courants sont pris en charge par des connexions AWS Glue. Pour plus d'informations sur les connexions AWS Glue, consultez Connexion aux données.

Les connexions AWS Glue facilitent la connexion de votre tâche à divers types de magasins de données de deux manières principales : par des appels de méthode à nos bibliothèques et par la définition de Connexion réseau dans la consoleAWS. Vous pouvez également appeler le SDK AWS depuis votre tâche pour récupérer des informations à partir d'une connexion.

Appel de la méthode–AWS GlueLes connexions sont étroitement intégrées au Catalogue de données AWS Glue, un service qui vous permet de gérer des informations sur vos jeux de données, et les méthodes disponibles pour l’interaction avec les connexions AWS Glue en sont le reflet. Si vous avez une configuration d'authentification existante que vous souhaitez réutiliser, pour les connexions JDBC, vous pouvez accéder à votre configuration de la connexion AWS Glue via la méthode extract_jdbc_conf surGlueContext. Pour plus d’informations, veuillez consulter extract_jdbc_conf

Configuration de la console–AWS GlueUtilisation des tâches associées aux connexions AWS Glue pour la configuration des connexions aux sous-réseaux Amazon VPC. Si vous gérez directement vos supports de sécurité, vous devrez peut-être fournir un NETWORKtype de Connexion réseau supplémentaire dans la console AWS pour configurer le routage. Pour plus d'informations sur la connexion API AWS Glue, consultez API de connexions

Si vos programmes Spark disposent d'un flux d'authentification personnalisé ou peu commun, vous devrez peut-être gérer vos supports de sécurité manuellement. Si les connexions AWS Glue ne vous conviennent pas, vous pouvez héberger en toute sécurité des éléments de sécurité dans Secrets Manager et y accéder via le boto3 ou SDK AWS qui vous sont fournis dans la tâche.

Configuration d'Apache Spark

Les migrations complexes modifient souvent la configuration de Spark pour s'adapter à leurs charges de travail. Les versions modernes d'Apache Spark permettent de configurer l'environnement d'exécution avec leSparkSession. AWS Glue Les tâches 3.0+SparkSession, peuvent être modifiés pour définir la configuration d’exécution de l'environnement. Configuration d'Apache Spark. Le lancement de Spark est complexe et AWS Glue ne garantit pas la prise en charge de la fonction configuration de tous les paramètres Spark. Si votre migration nécessite une configuration importante au niveau Spark, contactez le support.

Définition de la configuration

Les programmes Spark migrés peuvent être conçus de manière à prendre en charge une configuration personnalisée.AWS Glue permet de définir la configuration au niveau de la tâche et de son exécution, via les arguments de la tâche. Pour plus d'informations sur ces arguments, consultez Utilisation des paramètres de tâche dans les tâches AWS Glue. Vous pouvez accéder aux arguments de la tâche dans le contexte d'une tâche via nos bibliothèques. AWS Glue fournit une fonction utilitaire qui offre une vue cohérente entre les arguments définis sur la tâche et les arguments définis lors de l'exécution de la tâche. Voir Accès aux paramètres à l'aide de getResolvedOptions dans Python et Liste des API GlueArgParser Scala AWS Glue dans Scala.

Migration du code Java

Comme expliqué dans Intégration des bibliothèques tierces, vos dépendances peuvent contenir des classes générées par les langages JVM, tels que Java ou Scala. Vos dépendances peuvent inclure une Méthodemain. Vous pouvez utiliser une méthode main dans une dépendance en tant que point d'entrée pour une tâche scala AWS Glue. Cela vous permet de rédiger votre méthode main en langage Java, ou réutilisez une méthode main empaquetée selon les normes de votre propre bibliothèque.

Pour utiliser une méthode main à partir d'une dépendance, effectuez les opérations suivantes : Effacez le contenu du volet d'édition en fournissant la valeur par défaut de l’objet GlueApp. Fournissez le nom complet d'une classe dans une dépendance en tant qu'argument de travail avec la clé --class. Vous devez ensuite être en mesure de déclencher une exécution de la tâche.

Vous ne pouvez pas configurer l'ordre ou la structure des arguments AWS Glue pour passer à Méthode main. Si votre code existant doit lire la configuration définie dans AWS Glue, cela entraînera probablement une incompatibilité avec le code précédent. Si vous utilisez getResolvedOptions, vous ne disposerez pas d’un espace approprié pour appeler cette méthode. Envisagez d'invoquer votre dépendance directement, à partir d'une méthode principale générée par AWS Glue. Le cas de script ETL AWS Glue ci-dessous est un exemple de ce type.

import com.amazonaws.services.glue.util.GlueArgParser object GlueApp { def main(sysArgs: Array[String]) { val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) // Invoke static method from JAR. Pass some sample arguments as a String[], one defined inline and one taken from the job arguments, using getResolvedOptions com.mycompany.myproject.MyClass.myStaticPublicMethod(Array("string parameter1", args("JOB_NAME"))) // Alternatively, invoke a non-static public method. (new com.mycompany.myproject.MyClass).someMethod() } }