Génération de données de test à l'aide d'une tâche AWS Glue et de Python - Recommandations AWS

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.

Génération de données de test à l'aide d'une tâche AWS Glue et de Python

Créée par Moinul Al-Mamun () AWS

Environnement : Production

Technologies : analyse CloudNative ; lacs de données DevelopmentAndTesting ; sans serveur ; mégadonnées

AWSservices : AWS Glue ; Amazon S3

Récapitulatif

Ce modèle vous montre comment générer rapidement et facilement des millions d'exemples de fichiers simultanément en créant une tâche AWS Glue écrite en Python. Les fichiers d'exemple sont stockés dans un compartiment Amazon Simple Storage Service (Amazon S3). La capacité à générer rapidement un grand nombre d'échantillons de fichiers est importante pour tester ou évaluer les services dans le AWS cloud. Par exemple, vous pouvez tester les performances des DataBrew tâches AWS Glue Studio ou AWS Glue en analysant les données de millions de petits fichiers contenus dans un préfixe Amazon S3.

Bien que vous puissiez utiliser d'autres AWS services pour générer des exemples de jeux de données, nous vous recommandons d'utiliser AWS Glue. Vous n'avez pas besoin de gérer d'infrastructure car AWS Glue est un service de traitement de données sans serveur. Vous pouvez simplement apporter votre code et l'exécuter dans un cluster AWS Glue. En outre, AWS Glue fournit, configure et adapte les ressources nécessaires à l'exécution de vos tâches. Vous ne payez que pour les ressources utilisées par vos tâches pendant leur exécution.

Conditions préalables et limitations

Prérequis

  • Un AWS compte actif

  • AWSInterface de ligne de commande (AWSCLI), installée et configurée pour fonctionner avec le AWS compte

Versions du produit

  • Python 3.9

  • AWSCLIversion 2

Limites

Le nombre maximum de tâches AWS Glue par déclencheur est de 50. Pour plus d'informations, consultez AWSla section Points de terminaison et quotas Glue.

Architecture

Le schéma suivant décrit un exemple d'architecture centré sur une tâche AWS Glue qui écrit sa sortie (c'est-à-dire des fichiers d'exemple) dans un compartiment S3.

Le flux de travail indique qu'AWSCLIil lance une tâche AWS Glue qui écrit la sortie dans le compartiment S3.

Le diagramme inclut le flux de travail suivant :

  1. Vous utilisez la AWS CLI console AWS de gestion ou un API pour lancer la tâche AWS Glue. Le AWS CLI or vous API permet d'automatiser la parallélisation de la tâche invoquée et de réduire le temps d'exécution nécessaire à la génération de fichiers d'exemple.

  2. La tâche AWS Glue génère le contenu du fichier de manière aléatoire, le convertit en CSV format, puis le stocke sous la forme d'un objet Amazon S3 sous un préfixe commun. La taille de chaque fichier est inférieure à un kilo-octet. La tâche AWS Glue accepte deux paramètres de tâche définis par l'utilisateur : START_RANGE etEND_RANGE. Vous pouvez utiliser ces paramètres pour définir les noms de fichiers et le nombre de fichiers générés dans Amazon S3 par chaque tâche exécutée. Vous pouvez exécuter plusieurs instances de cette tâche en parallèle (par exemple, 100 instances).

Outils

  • Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.

  • AWSL'interface de ligne de commande (AWSCLI) est un outil open source qui vous permet d'interagir avec les AWS services par le biais de commandes dans votre interface de ligne de commande.

  • AWSGlue est un service d'extraction, de transformation et de chargement (ETL) entièrement géré. Il vous aide à classer, nettoyer, enrichir et déplacer les données de manière fiable entre les magasins de données et les flux de données.

  • AWSIdentity and Access Management (IAM) vous aide à gérer en toute sécurité l'accès à vos AWS ressources en contrôlant qui est authentifié et autorisé à les utiliser.

Bonnes pratiques

Tenez compte des bonnes pratiques suivantes en matière de AWS Glue lorsque vous implémentez ce modèle :

  • Utilisez le bon type de AWS Glue Worker pour réduire les coûts. Nous vous recommandons de comprendre les différentes propriétés des types de travailleurs, puis de choisir le type de travailleur adapté à votre charge de travail en fonction CPU de vos besoins en mémoire. Pour ce modèle, nous vous recommandons d'utiliser une tâche shell Python comme type de tâche afin de minimiser DPU et de réduire les coûts. Pour plus d'informations, consultez la section Ajouter des tâches dans AWS Glue dans le AWS Glue Developer Guide.

  • Utilisez la bonne limite de simultanéité pour adapter votre travail. Nous vous recommandons de baser la simultanéité maximale de votre tâche AWS Glue sur le temps nécessaire et le nombre de fichiers requis.

  • Commencez par générer un petit nombre de fichiers. Pour réduire les coûts et gagner du temps lors de la création de vos tâches AWS Glue, commencez par un petit nombre de fichiers (1 000, par exemple). Cela peut faciliter le dépannage. Si la génération d'un petit nombre de fichiers est réussie, vous pouvez passer à un plus grand nombre de fichiers.

  • Exécutez d'abord localement. Pour réduire les coûts et gagner du temps lors de la création de vos jobs AWS Glue, lancez le développement localement et testez votre code. Pour obtenir des instructions sur la configuration d'un conteneur Docker qui peut vous aider à écrire des tâches AWS Glue extract, transform et load (ETL) à la fois dans un shell et dans un environnement de développement intégré (IDE), consultez l'article Developing AWS Glue ETL jobs locally using a container sur le AWS Big Data Blog.

Pour en savoir plus AWS sur les meilleures pratiques en matière de Glue, consultez la section Meilleures pratiques de la documentation AWS Glue.

Épopées

TâcheDescriptionCompétences requises

Créez un compartiment S3 pour stocker les fichiers.

Créez un compartiment S3 et un préfixe à l'intérieur de celui-ci.

Remarque : Ce modèle utilise l's3://{your-s3-bucket-name}/small-files/emplacement à des fins de démonstration.

Développeur d'applications

Créez et configurez un IAM rôle.

Vous devez créer un IAM rôle que votre tâche AWS Glue peut utiliser pour écrire dans votre compartiment S3.

  1. Créez un IAMrôle (par exemple, appelé"AWSGlueServiceRole-smallfiles").

  2. Choisissez AWS Glue comme entité de confiance pour la politique.

  3. Associez une politique AWS gérée appelée "AWSGlueServiceRole" au rôle.

  4. Créez une politique intégrée ou une politique gérée par le client appelée "s3-small-file-access" en fonction de la configuration suivante. "{bucket}"Remplacez-le par le nom de votre compartiment.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{bucket}/small-files/input/*" ] } ] }
  5. Associez la "s3-small-file-access" politique à votre rôle.

Développeur d'applications
TâcheDescriptionCompétences requises

Créez une tâche AWS Glue.

Vous devez créer une tâche AWS Glue qui génère votre contenu et le stocke dans un compartiment S3.

Créez une tâche AWS Glue, puis configurez votre tâche en effectuant les étapes suivantes :

  1. Connectez-vous à la console AWS de gestion et ouvrez la console AWS Glue.

  2. Dans le volet de navigation, sous Intégration des données ETL, sélectionnez Jobs.

  3. Dans la section Créer une tâche, choisissez l'éditeur de script Python Shell.

  4. Dans la section Options, sélectionnez Créer un nouveau script avec un code standard, puis choisissez Créer.

  5. Choisissez Détails du Job.

  6. Dans Nom, entrez create_small_files.

  7. Pour IAMRôle, sélectionnez le IAM rôle que vous avez créé précédemment.

  8. Dans la section This job runs, sélectionnez Un nouveau script que vous devez créer.

  9. Développez les propriétés avancées.

  10. Pour Maximum de simultanéité, entrez 100 à des fins de démonstration. Remarque : La simultanéité maximale définit le nombre d'instances du job que vous pouvez exécuter en parallèle.

  11. Choisissez Save (Enregistrer).

Développeur d'applications

Mettez à jour le code de tâche.

  1. Ouvrez la console AWS Glue.

  2. Dans le volet de navigation, sélectionnez Tâches.

  3. Dans la section Vos tâches, choisissez la tâche que vous avez créée précédemment.

  4. Choisissez l'onglet Script, puis mettez à jour le script en fonction du code suivant. Mettez à jour les text_str variables BUCKET_NAMEPREFIX, et avec vos valeurs.

    from awsglue.utils import getResolvedOptions import sys import boto3 from random import randrange # Two arguments args = getResolvedOptions(sys.argv, ['START_RANGE', 'END_RANGE']) START_RANGE = int(args['START_RANGE']) END_RANGE = int(args['END_RANGE']) BUCKET_NAME = '{BUCKET_NAME}' PREFIX = 'small-files/input/' s3 = boto3.resource('s3') for x in range(START_RANGE, END_RANGE): # generate file name file_name = f"input_{x}.txt" # generate text text_str = str(randrange(100000))+","+str(randrange(100000))+", " + str(randrange(10000000)) + "," + str(randrange(10000)) # write in s3 s3.Object(BUCKET_NAME, PREFIX + file_name).put(Body=text_str)
  5. Choisissez Save (Enregistrer).

Développeur d'applications
TâcheDescriptionCompétences requises

Exécutez le job AWS Glue depuis la ligne de commande.

Pour exécuter votre tâche AWS Glue depuis le AWSCLI, exécutez la commande suivante en utilisant vos valeurs :

cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"1000000"}' cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000000","--END_RANGE":"2000000"}'

Remarque : pour obtenir des instructions sur l'exécution de la tâche AWS Glue depuis la console de AWS gestion, consultez l'article sur ce modèle de la tâche Run the AWS Glue dans la console de AWS gestion.

Conseil : Nous vous recommandons d'utiliser les tâches AWS CLI to run AWS Glue si vous souhaitez exécuter plusieurs exécutions à la fois avec des paramètres différents, comme indiqué dans l'exemple ci-dessus.

Pour générer toutes les AWS CLI commandes nécessaires à la génération d'un nombre défini de fichiers à l'aide d'un certain facteur de parallélisation, exécutez le code bash suivant (en utilisant vos valeurs) :

# define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i-1) + _SB))'","--END_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i)))'"}'"'"; _SB=1; done

Si vous utilisez le script ci-dessus, tenez compte des points suivants :

  • Le script simplifie l'invocation et la génération de petits fichiers à grande échelle.

  • Mettez à jour NUMBER_OF_FILES et PARALLELIZATION avec vos valeurs.

  • Le script ci-dessus affiche la liste des commandes que vous devez exécuter. Copiez ces commandes de sortie, puis exécutez-les dans votre terminal.

  • Si vous souhaitez exécuter les commandes directement depuis le script, supprimez l'echoinstruction de la ligne 11.

Remarque : Pour voir un exemple de sortie du script ci-dessus, consultez la section Sortie du script Shell dans la section Informations supplémentaires de ce modèle.

Développeur d'applications

Exécutez le job AWS Glue dans la console AWS de gestion.

  1. Connectez-vous à la console AWS de gestion et ouvrez la console AWS Glue.

  2. Dans le volet de navigation, sous Intégration des données ETL, sélectionnez Jobs.

  3. Dans la section Vos emplois, choisissez votre poste.

  4. Dans la section Paramètres (facultatif), mettez à jour vos paramètres.

  5. Choisissez Action, puis Run job.

  6. Répétez les étapes 3 à 5 autant de fois que nécessaire. Par exemple, pour créer 10 millions de fichiers, répétez ce processus 10 fois.

Développeur d'applications

Vérifiez le statut de votre tâche AWS Glue.

  1. Ouvrez la console AWS Glue.

  2. Dans le volet de navigation, sélectionnez Tâches.

  3. Dans la section Vos tâches, choisissez la tâche que vous avez créée précédemment (c'est-à-direcreate_small_files).

  4. Pour avoir un aperçu de la progression et de la génération de vos fichiers, consultez les colonnes Run ID, Run Status et les autres colonnes.

Développeur d'applications

Ressources connexes

Références

Guides et modèles

Informations supplémentaires

Test d'analyse comparative

Ce modèle a été utilisé pour générer 10 millions de fichiers à l'aide de différents paramètres de parallélisation dans le cadre d'un test d'analyse comparative. Le tableau suivant montre le résultat du test :

Parallélisation

Nombre de fichiers générés par l'exécution d'une tâche

Durée du job

Speed (Vitesse)

10

1 000 000

6 heures, 40 minutes

Très lent

50

200 000

80 minutes

Modérée

100

100 000

40 minutes

Rapide

Si vous souhaitez accélérer le processus, vous pouvez configurer davantage d'exécutions simultanées dans la configuration de votre tâche. Vous pouvez facilement ajuster la configuration des tâches en fonction de vos besoins, mais gardez à l'esprit qu'il existe une limite de quota pour le service AWS Glue. Pour plus d'informations, consultez AWSla section Points de terminaison et quotas Glue.

Sortie du script Shell

L'exemple suivant montre la sortie du script shell de la tâche Run the AWS Glue à partir de l'histoire de la ligne de commande selon ce modèle.

user@MUC-1234567890 MINGW64 ~ $ # define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i-1) + SB))'","--ENDRANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i)))'"}'"'"; _SB=1; done aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"200001","--END_RANGE":"400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"400001","--END_RANGE":"600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"600001","--END_RANGE":"800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"800001","--END_RANGE":"1000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000001","--END_RANGE":"1200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1200001","--END_RANGE":"1400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1400001","--END_RANGE":"1600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1600001","--END_RANGE":"1800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1800001","--END_RANGE":"2000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2000001","--END_RANGE":"2200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2200001","--END_RANGE":"2400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2400001","--END_RANGE":"2600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2600001","--END_RANGE":"2800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2800001","--END_RANGE":"3000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3000001","--END_RANGE":"3200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3200001","--END_RANGE":"3400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3400001","--END_RANGE":"3600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3600001","--END_RANGE":"3800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3800001","--END_RANGE":"4000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4000001","--END_RANGE":"4200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4200001","--END_RANGE":"4400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4400001","--END_RANGE":"4600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4600001","--END_RANGE":"4800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4800001","--END_RANGE":"5000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5000001","--END_RANGE":"5200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5200001","--END_RANGE":"5400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5400001","--END_RANGE":"5600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5600001","--END_RANGE":"5800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5800001","--END_RANGE":"6000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6000001","--END_RANGE":"6200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6200001","--END_RANGE":"6400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6400001","--END_RANGE":"6600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6600001","--END_RANGE":"6800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6800001","--END_RANGE":"7000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7000001","--END_RANGE":"7200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7200001","--END_RANGE":"7400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7400001","--END_RANGE":"7600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7600001","--END_RANGE":"7800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7800001","--END_RANGE":"8000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8000001","--END_RANGE":"8200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8200001","--END_RANGE":"8400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8400001","--END_RANGE":"8600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8600001","--END_RANGE":"8800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8800001","--END_RANGE":"9000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9000001","--END_RANGE":"9200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9200001","--END_RANGE":"9400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9400001","--END_RANGE":"9600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9600001","--END_RANGE":"9800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9800001","--END_RANGE":"10000000"}' user@MUC-1234567890 MINGW64 ~

FAQ

Combien d'exécutions simultanées ou de tâches parallèles dois-je utiliser ?

Le nombre d'exécutions simultanées et de tâches parallèles dépend du temps dont vous avez besoin et du nombre de fichiers de test souhaités. Nous vous recommandons de vérifier la taille des fichiers que vous créez. Tout d'abord, vérifiez le temps nécessaire à une tâche AWS Glue pour générer le nombre de fichiers souhaité. Utilisez ensuite le bon nombre de courses simultanées pour atteindre vos objectifs. Par exemple, si vous supposez qu'il faut 40 minutes pour terminer l'exécution de 100 000 fichiers alors que votre objectif est de 30 minutes, vous devez augmenter le paramètre de simultanéité pour votre tâche AWS Glue.

Quel type de contenu puis-je créer à l'aide de ce modèle ?

Vous pouvez créer n'importe quel type de contenu, tel que des fichiers texte avec différents délimiteurs (par exemplePIPE,JSON, ouCSV). Ce modèle utilise Boto3 pour écrire dans un fichier, puis enregistre le fichier dans un compartiment S3.

De quel niveau d'IAMautorisation ai-je besoin dans le compartiment S3 ?

Vous devez disposer d'une politique basée sur l'identité qui autorise Write l'accès aux objets de votre compartiment S3. Pour plus d'informations, consultez Amazon S3 : autorise l'accès en lecture et en écriture aux objets d'un compartiment S3 dans la documentation Amazon S3.