Un système de fichiers distribué stocke les données sous forme de blocs. Les fichiers dont la taille est inférieure à celle d'un bloc (64 Mo) sont considérés comme des petits fichiers. Les systèmes distribués génèrent inévitablement de petits fichiers, qu'il s'agisse de la sortie de jobs SQL, d'autres moteurs distribués ou de données collectées via Tunnel. La fusion de ces petits fichiers optimise les performances du système. Cette rubrique explique comment fusionner les petits fichiers dans MaxCompute.
Contexte
Un nombre excessif de petits fichiers peut entraîner les problèmes suivants :
MaxCompute traite un seul fichier volumineux plus efficacement que plusieurs petits fichiers. Un nombre trop élevé de petits fichiers peut dégrader les performances d'exécution globales.
Une surabondance de petits fichiers peut mettre le système de fichiers Pangu sous tension et réduire l'efficacité du stockage.
Il est donc essentiel de fusionner les petits fichiers générés lors des calculs afin d'optimiser à la fois le stockage et les performances. MaxCompute propose plusieurs fonctionnalités puissantes pour gérer les petits fichiers :
Par défaut, une fois un job terminé, le système attribue automatiquement une tâche Fuxi pour fusionner les petits fichiers si certaines conditions sont remplies. Ce processus est appelé MergeTask.
Par défaut, une instance Fuxi peut traiter jusqu'à 100 petits fichiers. Le paramètre
odps.sql.mapper.merge.limit.sizecontrôle la taille totale des fichiers à lire.MaxCompute analyse périodiquement la base de données de métadonnées en arrière-plan et fusionne les petits fichiers pour les tables ou partitions qui en contiennent un grand nombre. Ce processus est transparent pour les utilisateurs.
Toutefois, la découverte des métadonnées peut encore révéler de nombreux petits fichiers non fusionnés. Par exemple, si une table fait l'objet d'écritures continues, l'opération de fusion automatique ne peut pas s'exécuter. Dans ce cas, arrêtez d'abord le job d'écriture, puis fusionnez manuellement les petits fichiers.
Précautions
La fusion des petits fichiers consomme des ressources de calcul. Si votre instance utilise la méthode de facturation paiement à l'utilisation, cette opération vous sera facturée. Les règles de facturation sont identiques à celles des jobs SQL en paiement à l'utilisation. Pour plus d'informations, consultez Tarification du calcul (paiement à l'utilisation).
La commande de fusion des petits fichiers ne prend pas en charge les tables transactionnelles. Pour fusionner les petits fichiers d'une table transactionnelle, consultez COMPACTION.
Vérifier le nombre de fichiers d'une table
-
Syntaxe
DESC EXTENDED <table_name> [PARTITION (<pt_spec>)]; -
Paramètres
-
table_name
Obligatoire. Nom de la table à vérifier.
-
pt_spec
Facultatif. Partition à vérifier. Le format est
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...).
-
-
Exemple
Un échantillon de partition de la table
odl_bpm_wfc_task_logcontient 3 607 fichiers. La taille de la partition est de 274 Mo (287 869 658 octets) et la taille moyenne des fichiers est d'environ 0,07 Mo. Les petits fichiers de cette partition doivent être fusionnés.odps@ admin_task_project>desc extended jxbwarehouse.odl_bpm_wfc_task_log partition(new_dts_sync_modifytime_year='2022',new_dts_sync_modifytime_month='11',new_dts_sync_modifytime_day='27'); +--------------------------------------------------------------------------------------------+ | PartitionSize: 287869658 | +--------------------------------------------------------------------------------------------+ | CreateTime: 2022-11-27 00:00:46 | | LastDDLTime: 2022-11-27 00:00:46 | | LastModifiedTime: 2022-11-27 23:59:47 | +--------------------------------------------------------------------------------------------+ | IsExstore: false | | IsArchived: false | | PhysicalSize: 863608974 | | FileNum: 3607 | +--------------------------------------------------------------------------------------------+
Solutions
La détection des métadonnées permet d'identifier les partitions adaptées à une fusion de fichiers. Une fusion est recommandée si une partition contient plus de 100 fichiers et que la taille moyenne des fichiers est inférieure à 64 Mo. Deux solutions sont disponibles.
-
Fusion immédiate
Utilisez la commande suivante pour effectuer une fusion immédiate.
ALTER TABLE <table_name> [partition (<pt_spec>)] MERGE SMALLFILES;Après avoir exécuté l'opération de fusion immédiate sur la table
odl_bpm_wfc_task_log, le nombre de fichiers est réduit à 19 et la taille de stockage à 37 Mo. Cela démontre que la fusion des petits fichiers améliore également considérablement l'efficacité du stockage.Dans la plupart des cas, les paramètres par défaut suffisent pour fusionner les petits fichiers. Toutefois, MaxCompute met à disposition plusieurs paramètres pour répondre à des besoins personnalisés. Voici les paramètres courants :
-
SET odps.merge.cross.paths=true|falseIndique s'il faut fusionner les fichiers entre différents chemins. Si une table comporte plusieurs partitions, le processus de fusion génère une MergeAction distincte pour chaque partition. Par conséquent, définir
odps.merge.cross.pathssur true ne modifie pas le nombre de chemins. Cela fusionne uniquement les petits fichiers au sein de chaque chemin séparément. -
SET odps.merge.smallfile.filesize.threshold = 64Spécifie le seuil, en Mo, de la taille des petits fichiers à fusionner. Les fichiers dépassant ce seuil ne sont pas fusionnés. Il n'est pas nécessaire de définir ce paramètre. S'il n'est pas défini, la variable globale
odps_g_merge_filesize_thresholdest utilisée, avec une valeur par défaut de 32 Mo. Si vous définissez ce paramètre, sa valeur doit être supérieure à 32 Mo. -
SET odps.merge.maxmerged.filesize.threshold = 500Spécifie la taille du fichier de sortie après la fusion, en Mo. Si un fichier de sortie dépasse ce seuil, un nouveau fichier de sortie est créé. Il n'est pas nécessaire de définir ce paramètre. S'il n'est pas défini, la variable globale
odps_g_max_merged_filesize_thresholdest utilisée, avec une valeur par défaut de 500 Mo. Si vous définissez ce paramètre, sa valeur doit être supérieure à 500 Mo.
-
-
Fusion à l'aide d'un script PyODPS
Utilisez PyODPS pour soumettre de manière asynchrone une tâche qui fusionne les petits fichiers générés par les jobs de la veille. Le code suivant fournit un exemple de script :
import os from odps import ODPS # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your Access Key ID. # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your Access Key Secret. # Do not use the Access Key ID and Access Key Secret strings directly. o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) # Note: Replace $table_name with the name of your table. table_name = $table_name t = o.get_table(table_name) # Set merge options. hints = {'odps.merge.maxmerged.filesize.threshold': 256} # Examples for multiple partitions insts = [] # iterate_partitions lists all partitions under ds=$datetime. The partition format may vary. for partition in t.iterate_partitions(spec="ds=%s" % $datetime): instance=o.run_merge_files(table_name, str(partition), hints=hints) # Click the Waiting Queue in this Logview to find the Logview for the actual execution. print(instance.get_logview_address()) insts.append(instance) # Wait for the partition results. for inst in insts: inst.wait_for_completion()Pour exécuter ce script, vous devez d'abord installer PyODPS. Pour les instructions d'installation, consultez PyODPS.
Cas d'utilisation
La table tbcdm.dwd_tb_log_pv_di est une table physique que le système de stabilité des données a identifiée comme nécessitant une fusion de petits fichiers. Selon la table de métadonnées tbcdm.dws_rmd_merge_task_1d, la plupart des partitions de cette table contiennent plus de 1 000 fichiers — certaines dépassant même 7 000 — alors que la taille moyenne des fichiers est inférieure à 1 Mo.
Utilisez les commandes suivantes pour fusionner les petits fichiers à l'aide de la solution de fusion immédiate.
SET odps.merge.cross.paths=true;
SET odps.merge.smallfile.filesize.threshold=128;
SET odps.merge.max.filenumber.per.instance = 2000;
ALTER TABLE tbcdm.dwd_tb_log_pv_di PARTITION (ds='20151116') MERGE smallfiles;