Quando um job SQL do MaxCompute apresenta desempenho abaixo do esperado, a causa geralmente é o desequilíbrio entre o número de tarefas e os recursos disponíveis. O hint split_size controla como o MaxCompute divide os dados da tabela em blocos para processamento paralelo. Cada bloco se torna uma tarefa map; portanto, o tamanho do split determina diretamente a concorrência do job. Ajuste esse valor para equilibrar a quantidade de tarefas com os recursos disponíveis: splits menores geram mais tarefas map para maior paralelismo, enquanto splits maiores reduzem o número de tarefas e aliviam a pressão no agendamento.
SELECT ...
FROM <table_name> /*+split_size(<value_in_mb>)*/
...
O tamanho padrão do split é 256 MB.
Funcionamento
O MaxCompute lê os dados de uma tabela e os divide em splits do tamanho especificado. O número de tarefas map corresponde aproximadamente a:
map tasks = table data size / split_size
Por exemplo, uma tabela de 10 GB com split_size(256) gera cerca de 40 tarefas map. Reduzir para split_size(64) cria aproximadamente 160 tarefas map, ou seja, quatro vezes mais paralelismo.
O MaxCompute respeita o hint split_size na maioria das tabelas. Há uma exceção: se o otimizador de consultas utilizar as propriedades de bucketing de uma tabela clusterizada para otimização, ele ignorará o hint para essa tabela específica.
Ajuste do tamanho do split
O descompasso entre o volume de tarefas e os recursos disponíveis está entre as causas mais frequentes de lentidão em jobs SQL:
Excesso de tarefas para os recursos disponíveis -- As tarefas entram em fila aguardando slots de execução, o que aumenta o overhead de agendamento. O job passa mais tempo esperando do que computando.
Poucas tarefas para os recursos disponíveis -- Os recursos ficam ociosos enquanto um pequeno número de tarefas processa grandes blocos de dados sequencialmente. O job demora mais do que o necessário.
|
Cenário |
Ação |
Motivo |
|
Tarefas em fila por recursos |
Aumente o |
Menos tarefas map reduzem a contenção e o overhead de agendamento |
|
Recursos ociosos durante a execução do job |
Diminua o |
Mais tarefas map executam em paralelo, melhorando a utilização dos recursos |
Defina o split_size em múltiplos de 256 MB (ex.: 256, 512, 1024) para obter desempenho ideal.
Exemplos
Em todos os exemplos, o hint aparece logo após o nome da tabela na cláusula FROM.
Defina o tamanho do split como 1 MB ao ler src. O MaxCompute dividirá os dados da tabela src em blocos de 1 MB, cada um processado por uma tarefa map distinta. Para uma tabela de 10 GB, isso gera cerca de 10.240 tarefas map em vez das 40 padrão:
SELECT a.key
FROM src a /*+split_size(1)*/
JOIN src2 b ON a.key = b.key;
Aumente o tamanho do split para 512 MB a fim de reduzir o número de tarefas em uma tabela grande. Em uma tabela de 10 GB, essa configuração diminui a contagem de tarefas de 40 para aproximadamente 20:
SELECT *
FROM large_table /*+split_size(512)*/
WHERE dt = '2024-01-01';
Comportamento com tabelas clusterizadas e múltiplos hints
Tabelas clusterizadas: O otimizador de consultas ignora o hint
split_sizeem uma tabela clusterizada caso utilize as propriedades de bucketing dessa tabela para otimização.-
Múltiplos hints na mesma tabela: Se uma consulta ler a mesma tabela várias vezes com diferentes hints
split_size, o MaxCompute adotará o menor valor. Por exemplo:split_size(1)esplit_size(10)na mesma tabela -- o MaxCompute usa1.split_size(1)em uma referência e nenhum hint em outra -- o MaxCompute usa1(não o padrão de 256 MB).
Referência
|
Propriedade |
Valor |
Descrição |
|
Nome do hint |
|
Nome utilizado no comentário de hint |
|
Sintaxe |
|
Sintaxe de comentário inline posicionada após o nome da tabela |
|
Posicionamento |
Após o nome da tabela em uma consulta |
Aplica-se especificamente à tabela que o precede |
|
Unidade |
MB |
O valor do split size é interpretado em megabytes |
|
Padrão |
256 |
Utilizado quando nenhum hint é especificado |
|
Valores recomendados |
Múltiplos de 256 (ex.: 256, 512, 1024) |
Alinha-se aos limites internos de blocos para desempenho ideal |
|
Resolução de conflitos |
Menor valor entre todos os hints na mesma tabela |
Aplica-se quando a mesma tabela aparece múltiplas vezes com hints diferentes |