Je souhaite configurer une tâche ETL AWS Glue pour générer un petit nombre de fichiers volumineux au lieu d'un grand nombre de petits fichiers.
Résolution
Augmenter la valeur du paramètre groupSize
Lorsque vous utilisez des cadres dynamiques et que le jeu de données Amazon Simple Storage Service (Amazon S3) contient plus de 50 000 fichiers, la tâche ETL AWS Glue regroupe automatiquement les fichiers. Pour créer moins de fichiers de sortie plus volumineux, augmentez la valeur de groupSize. Pour en savoir plus, consultez la section Lecture de fichiers d’entrée dans des groupes plus volumineux.
Dans l'exemple suivant, groupSize est défini sur 10485760 octets, soit environ 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 fichier .csv, .ion, .grokLog, .json et .xml. Les formats de fichier .avro, .parquet et .orc ne prennent pas en charge ces paramètres.
Utilisez la fonction coalesce ou répartition
Procédez comme suit :
-
(Facultatif) Calculez votre nombre cible de partitions (N) en fonction de la taille du jeu de données d’entrée. Utilisez la formule targetNumPartitions = 1 Gb * 1000 Mb/10 Mb = 100 pour contrôler la taille de votre fichier de sortie.
Remarque : Dans la formule précédente, la taille d'entrée est de 1 Go, la taille de sortie cible est de 10 Mo et le nombre cible de partitions est de 100.
-
Pour vérifier le nombre actuel de partitions, exécutez la commande suivante :
currentNumPartitions = dynamic_frame.getNumPartitions()
-
Pour réduire le nombre de fichiers de sortie, diminuez le nombre de partitions de sortie Apache Spark avant d'écrire sur Amazon S3. Pour réduire le nombre de partitions, utilisez la fonction coalesce de Spark :
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)
Remarque : Si la valeur de targetNumPartitions est trop petite, la tâche risque d'échouer en raison de problèmes d'espace disque.
-ou-
Utilisez la fonction répartition d'Apache Spark.
dynamic_frame_with_less_partitions=dynamic_frame.repartition(targetNumPartitions)
Remarque : Pour générer des fichiers plus volumineux, définissez targetNumPartitions sur une valeur inférieure à currentNumPartitions.
Les fonctions coalesce et répartition peuvent augmenter la durée d'exécution de votre tâche car les deux fonctions remanient vos données. Cependant, la fonction coalesce utilise les partitions existantes pour minimiser le nombre de remaniements de données.
Utiliser MaxRecordsPerFile
Utilisez maxRecordsPerFile dans la méthode d’écriture de Spark pour augmenter le nombre maximum d'enregistrements pour chaque 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 définit un quota plus élevé pour le nombre d'enregistrements pour chaque fichier. Le nombre d'enregistrements de chaque fichier peut toujours être inférieur à la valeur de maxRecordsPerFile. Si vous définissez maxRecordsPerFile à zéro ou sur une valeur négative, il n'y a pas de quota d'enregistrements.
Informations connexes
Corriger le traitement de plusieurs fichiers à l'aide de la fonction de regroupement