Todos os produtos
Search
Central de documentação

MaxCompute:Mesclar arquivos pequenos

Última atualização: Sep 02, 2026

Um sistema de arquivos distribuído armazena dados em blocos. Arquivos menores que o tamanho de bloco de 64 MB são considerados arquivos pequenos. Sistemas distribuídos inevitavelmente geram arquivos pequenos a partir de fontes como saída de jobs SQL, outros engines distribuídos ou dados coletados via Tunnel. Mesclar esses arquivos pequenos otimiza o desempenho do sistema. Este tópico descreve como mesclar arquivos pequenos no MaxCompute.

Informações básicas

Um número excessivo de arquivos pequenos pode causar os seguintes problemas:

  • O MaxCompute processa um único arquivo grande com mais eficiência do que múltiplos arquivos pequenos. Um volume excessivo de arquivos pequenos pode degradar o desempenho geral de execução.

  • Muitos arquivos pequenos podem sobrecarregar o sistema de arquivos Pangu e reduzir a eficiência de armazenamento.

Portanto, é importante mesclar os arquivos pequenos gerados durante a computação para otimizar tanto o armazenamento quanto o desempenho. O MaxCompute oferece vários recursos avançados para lidar com arquivos pequenos:

  • Por padrão, após a conclusão de um job, o sistema atribui automaticamente uma tarefa Fuxi para mesclar arquivos pequenos, caso certas condições sejam atendidas. Esse processo é conhecido como MergeTask.

  • Por padrão, uma instância Fuxi pode processar até 100 arquivos pequenos. O parâmetro odps.sql.mapper.merge.limit.size controla o tamanho total dos arquivos a serem lidos.

  • O MaxCompute verifica periodicamente o banco de dados de metadados em segundo plano e mescla arquivos pequenos de tabelas ou partições que contenham muitos deles. Esse processo é transparente para os usuários.

No entanto, a descoberta de metadados ainda pode revelar muitos arquivos pequenos não mesclados. Por exemplo, se uma tabela estiver recebendo gravações continuamente, a operação de mesclagem automática não poderá ser executada. Nesse caso, interrompa primeiro o job de gravação e depois mescle manualmente os arquivos pequenos.

Precauções

  • A mesclagem de arquivos pequenos consome recursos de computação. Se sua instância utilizar o método de faturamento pagamento conforme o uso, haverá cobrança por essa operação. As regras de faturamento são as mesmas aplicadas a jobs SQL no modelo pagamento conforme o uso. Para obter mais informações, consulte Compute pricing (pay-as-you-go).

  • O comando para mesclar arquivos pequenos não oferece suporte a tabelas transacionais. Para mesclar arquivos pequenos em uma tabela transacional, consulte COMPACTION.

Verificar o número de arquivos em uma tabela

  • Sintaxe

    DESC EXTENDED <table_name> [PARTITION (<pt_spec>)];
  • Parâmetros

    • table_name

      Obrigatório. O nome da tabela a verificar.

    • pt_spec

      Opcional. A partição a verificar. O formato é (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...).

  • Exemplo

    Uma partição de amostra da tabela odl_bpm_wfc_task_log possui 3.607 arquivos. O tamanho da partição é de 274 MB (287.869.658 bytes) e o tamanho médio do arquivo é de aproximadamente 0,07 MB. Os arquivos pequenos nesta partição precisam de mesclagem.

    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                                                             |
    +--------------------------------------------------------------------------------------------+

Soluções

A detecção de metadados pode identificar partições adequadas para mesclagem de arquivos. Recomenda-se a mesclagem se uma partição contiver mais de 100 arquivos e o tamanho médio do arquivo for inferior a 64 MB. Duas soluções estão disponíveis.

  • Mesclagem imediata

    Execute o seguinte comando para realizar uma mesclagem imediata.

    ALTER TABLE <table_name> [partition (<pt_spec>)] MERGE SMALLFILES;

    Após executar a operação de mesclagem imediata na tabela odl_bpm_wfc_task_log, o número de arquivos foi reduzido para 19 e o tamanho de armazenamento caiu para 37 MB. Isso demonstra que a mesclagem de arquivos pequenos também melhora significativamente a eficiência de armazenamento.

    Na maioria dos casos, os parâmetros padrão são suficientes para mesclar arquivos pequenos. No entanto, o MaxCompute fornece vários parâmetros para atender a requisitos personalizados. Veja a seguir os parâmetros comuns:

    • SET odps.merge.cross.paths=true|false

      Define se os arquivos devem ser mesclados entre caminhos. Se uma tabela tiver várias partições, o processo de mesclagem gera uma MergeAction separada para cada partição. Portanto, definir odps.merge.cross.paths como true não altera o número de caminhos, apenas mescla os arquivos pequenos dentro de cada caminho separadamente.

    • SET odps.merge.smallfile.filesize.threshold = 64

      Especifica o limiar, em MB, para o tamanho dos arquivos pequenos a serem mesclados. Arquivos maiores que esse limiar não são mesclados. Não é obrigatório definir este parâmetro. Caso não seja definido, será usada a variável global odps_g_merge_filesize_threshold, que tem um valor padrão de 32 MB. Se você definir este parâmetro, o valor deverá ser maior que 32 MB.

    • SET odps.merge.maxmerged.filesize.threshold = 500

      Determina o tamanho do arquivo de saída após a mesclagem, em MB. Se um arquivo de saída exceder esse limiar, um novo arquivo de saída será criado. Não é necessário configurar este parâmetro. Na ausência de configuração, o sistema utiliza a variável global odps_g_max_merged_filesize_threshold, cujo valor padrão é 500 MB. Ao definir este parâmetro, o valor deve ser superior a 500 MB.

  • Mesclagem usando um script PyODPS

    Use o PyODPS para enviar de forma assíncrona uma tarefa que mescla os arquivos pequenos gerados pelos jobs do dia anterior. O código a seguir fornece um exemplo 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()

    Para executar este script, instale primeiro o PyODPS. Para obter instruções de instalação, consulte PyODPS.

Caso de uso

tbcdm.dwd_tb_log_pv_di é uma tabela física identificada pelo sistema de estabilidade de dados como necessitando de mesclagem de arquivos pequenos. De acordo com a tabela de metadados tbcdm.dws_rmd_merge_task_1d, a maioria das partições dessa tabela contém mais de 1.000 arquivos — algumas chegam a ultrapassar 7.000 — mas o tamanho médio do arquivo é inferior a 1 MB.

Use os comandos a seguir para mesclar os arquivos pequenos utilizando a solução de mesclagem imediata.

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;