Gravações incrementais repetidas, jobs SQL e importações via Tunnel geram um arquivo de saída separado por tarefa. Com o tempo, as partições acumulam milhares de arquivos menores que 64 MB. Esse cenário prejudica o desempenho das consultas e aumenta a carga no Apsara Distributed File System (ADFS). A mesclagem de arquivos pequenos consolida esses dados em menos arquivos e de maior tamanho, restaurando o desempenho das consultas.
O MaxCompute mescla a maioria dos arquivos automaticamente. Execute o comando de mesclagem manualmente apenas quando a mesclagem automática não conseguir acompanhar o ritmo de gravações contínuas.
Como funciona
O MaxCompute utiliza dois mecanismos para controlar o acúmulo de arquivos pequenos:
Mesclagem automática — Após a conclusão de um job, o MaxCompute aloca uma tarefa Fuxi para mesclar arquivos pequenos quando a quantidade de arquivos em uma partição ultrapassa o limiar definido. Por padrão, uma instância Fuxi processa no máximo 100 arquivos pequenos. Identifique mesclagens automáticas pela entrada MergeTask no log do job. O MaxCompute também varre periodicamente o banco de dados de metadados e mescla arquivos pequenos em qualquer tabela ou partição com alta contagem de arquivos.
Mesclagem manual — Quando os dados são gravados continuamente em uma tabela e a mesclagem automática não consegue acompanhar esse fluxo, interrompa o job de gravação e execute o comando MERGE SMALLFILES manualmente.
Limitações
A mesclagem de arquivos pequenos consome recursos de computação. Em instâncias de pagamento conforme o uso, as tarifas seguem a mesma taxa do faturamento de SQL sob demanda. Para detalhes sobre preços, consulte Preços de computação (pagamento conforme o uso).
O comando
MERGE SMALLFILESnão oferece suporte a tabelas transacionais. Para compactar uma tabela transacional, utilize o comando COMPACTION.
Verificar a contagem de arquivos em uma tabela
Execute DESC EXTENDED para visualizar quantos arquivos uma tabela ou partição contém.
Sintaxe
DESC EXTENDED <table_name> [PARTITION (<pt_spec>)];
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Nome da tabela a inspecionar |
|
|
Não |
Partição de destino. Formato: |
Exemplo de saída

O exemplo acima exibe a tabela odl_bpm_wfc_task_log: 3.607 arquivos, tamanho total de 274 MB (287.869.658 bytes) e tamanho médio de arquivo de aproximadamente 0,07 MB. Essa partição é uma boa candidata para mesclagem.
Quando mesclar: Se uma partição contiver mais de 100 arquivos e o tamanho médio for inferior a 64 MB, mescle os arquivos pequenos.
Mesclar arquivos pequenos
Usando um comando SQL
Execute o seguinte comando para mesclar arquivos pequenos sob demanda:
ALTER TABLE <table_name> [PARTITION (<pt_spec>)] MERGE SMALLFILES;
Após a mesclagem, a tabela odl_bpm_wfc_task_log passa de 3.607 arquivos para 19, e o armazenamento é reduzido de 274 MB para 37 MB.

Os parâmetros padrão atendem à maioria dos casos. Utilize os seguintes parâmetros SET para ajustar o comportamento da mesclagem quando necessário:
|
Parâmetro |
Descrição |
Padrão |
|
|
Define se os arquivos devem ser mesclados entre caminhos. Defina como |
— |
|
|
Arquivos com tamanho igual ou inferior a este valor (em MB) são elegíveis para mesclagem. Se não for definido, o sistema usa a variável global |
32 MB |
|
|
Tamanho máximo (em MB) de um único arquivo de saída após a mesclagem. Um novo arquivo de saída é criado quando esse limite é atingido. Caso não seja especificado, aplica-se a variável global |
500 MB |
|
|
Quantidade máxima de arquivos que uma única instância de mesclagem pode processar. |
— |
|
|
Tamanho total máximo de arquivos lidos por uma instância Fuxi. |
— |
Usando PyODPS
Utilize o PyODPS para enviar tarefas de mesclagem de forma assíncrona, o que é útil para consolidar múltiplas partições geradas pelos jobs do dia anterior.
Todos os exemplos utilizam odps.run_merge_files() para submeter uma tarefa de mesclagem assíncrona por partição e, em seguida, aguardar a conclusão de todas as tarefas.
import os
from odps import ODPS
# Load credentials from environment variables.
# Do not hardcode your AccessKey ID or AccessKey secret in your code.
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your-project>',
endpoint='<your-endpoint>',
)
# 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}
# Submit one merge task per partition under the target date.
# Replace <datetime> with the date value to target, e.g., '20240101'.
insts = []
for partition in t.iterate_partitions(spec='ds=<datetime>'):
instance = o.run_merge_files(table_name, str(partition), hints=hints)
# Open this Logview URL and click Waiting Queue to find the merge job log.
print(instance.get_logview_address())
insts.append(instance)
# Wait for all merge tasks to finish.
for inst in insts:
inst.wait_for_completion()
Substitua os seguintes espaços reservados antes de executar o script:
|
Espaço reservado |
Descrição |
Exemplo |
|
|
Nome do seu projeto MaxCompute |
|
|
|
Endpoint do seu MaxCompute |
|
|
|
Tabela alvo da mesclagem |
|
|
|
Valor da data da partição de destino |
|
Instale o PyODPS antes de executar o script. Para instruções de instalação, consulte a documentação do PyODPS.
Exemplo
Uma verificação de estabilidade de dados identificou que a tabela tbcdm.dwd_tb_log_pv_di precisa de mesclagem. A consulta à tabela de metadados tbcdm.dws_rmd_merge_task_1d revelou que a maioria das partições excede 1.000 arquivos, algumas passam de 7.000 arquivos e várias apresentam tamanho médio de arquivo abaixo de 1 MB.

Execute os comandos abaixo para mesclar os arquivos pequenos:
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;
Resultado após a mesclagem:

Próximos passos
COMPACTION — Compactar dados em tabelas transacionais
Preços de computação (pagamento conforme o uso) — Entender o faturamento de jobs de mesclagem