Comment configurer une tâche ETL AWS Glue pour générer des fichiers plus volumineux ?

Lecture de 3 minute(s)
0

Je veux configurer une tâche ETL AWS Glue pour générer un petit nombre de fichiers volumineux plutôt qu'un grand nombre de petits fichiers.

Solution

Utilisez l'une des méthodes suivantes pour réduire le nombre de fichiers de sortie pour une tâche ETL AWS Glue.

Augmentez la valeur du paramètre « groupSize »

Le regroupement est activé automatiquement lorsque vous utilisez des trames dynamiques et lorsque l'jeu de données Amazon Simple Storage Service (Amazon S3) contient plus de 50 000 fichiers. Augmentez cette valeur pour créer des fichiers de sortie moins nombreux mais plus volumineux. Pour plus d'informations, consultez l'article Lecture des fichiers en entrée dans des groupes de plus grande taille.

Dans l'exemple suivant, le paramètre groupSize est défini sur 10 485 760 octets (10 Mo) :

dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://awsexamplebucket/"], 'groupFiles': 'inPartition', 'groupSize': '10485760'}, format="json")

Remarque : les paramètres groupSize et groupFiles ne sont pris en charge que dans les formats de données suivants : csv, ion, grokLog, json et xml. Cette option n'est pas prise en charge pour avro, parquet et orc.

Utilisez coalesce(N) ou repartition(N)

1.    (Facultatif) Calculez votre nombre cible de partitions (N) en fonction de la taille du jeu de données d'entrée. Utilisez la formule suivante :

targetNumPartitions = 1 Go * 1000 Mo/10 Mo = 100

Remarque : dans cet exemple, la taille de l'entrée est de 1 Go, et la sortie cible est de 10 Mo. Ce calcul vous permet de contrôler la taille de votre fichier de sortie.

2.    Vérifiez le nombre actuel de partitions à l'aide du code suivant :

currentNumPartitions = dynamic_frame.getNumPartitions()

Remarque : lorsque vous repartitionnez, targetNumPartitions doit être inférieur à currentNumPartitions.

  1.    Utilisez une opération Apache Spark coalesce() pour réduire le nombre de partitions de sortie Spark avant d'écrire sur Amazon S3. Cela permet de réduire le nombre de fichiers de sortie. Par exemple :
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)

Gardez à l'esprit les points suivants :

  • L'opération coalesce () procède à des remaniements de données Spark, ce qui peut considérablement augmenter le temps d'exécution de la tâche.
  • Si vous spécifiez un petit nombre de partitions, la tâche peut échouer. Par exemple, si vous exécutez coalesce (1), Spark essaie de placer toutes les données dans une seule partition. Cela peut entraîner des problèmes d'espace disque.
  • Vous pouvez également utiliser repartition() pour réduire le nombre de partitions. La fonction repartition() remanie toutefois toutes les données. L'opération coalesce() utilise les partitions existantes pour réduire le nombre de remaniements de données. Pour plus d'informations sur l'utilisation de repartition(), consultez Répartition Spark (français non disponible) sur le site Web de l'eduCBA.

Utilisation de maxRecordsPerFile

Utilisez la méthode Spark write() pour contrôler le nombre maximum d'enregistrements par fichier. L'exemple suivant définit le nombre maximum d'enregistrements à 20 :

df.write.option("compression", "gzip").option("maxRecordsPerFile",20).json(s3_path)

Remarque : l'option maxRecordsPerFile agit uniquement comme une limite supérieure pour le nombre d'enregistrements par fichier. Le nombre d'enregistrements de chaque fichier sera inférieur ou égal au nombre spécifié. Si la valeur est nulle ou négative, il n'y a pas de limite.


Informations connexes

Corriger le traitement de plusieurs fichiers grâce au regroupement

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an