Tous les produits
Search
Centre de documentation

MaxCompute:Fusionner les petits fichiers

Dernière mise à jour :Sep 02, 2026

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.size contrô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_log contient 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|false

      Indique 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.paths sur 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 = 64

      Spé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_threshold est 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 = 500

      Spé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_threshold est 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;