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.sizecontrola 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_logpossui 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|falseDefine 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.pathscomo 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 = 64Especifica 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 = 500Determina 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;