Spark

Nível médio

Por que a execução adaptativa de consultas do Spark não está realmente ajudando meu job?

O AQE replaneja uma consulta do Spark usando os números reais de um shuffle que já rodou - não o chute do planejador. Mas só consegue fazer isso se nada estiver desativando ele em silêncio.

Ler em:
Plano estático AQE: só coalesce AQE: coalesce + skew
Aproximadamente como o tempo do estágio de shuffle diminui ao permitir os dois mecanismos do AQE - não é um benchmark medido.

Duas configurações decidem se o AQE faz alguma coisa, e ambas podem estar configuradas de um jeito que o anula sem erro, sem aviso, e sem nenhum sinal na Spark UI.

O que o AQE realmente muda no meio da consulta

Depois que cada estágio de shuffle termina, o AQE tem os tamanhos reais das partições para trabalhar - não a estimativa inicial do planejador. Ele usa isso para juntar muitas partições de shuffle pequenas em menos e maiores, trocar um sort-merge join por um broadcast join se um lado acabar sendo pequeno o bastante, e dividir uma partição desproporcionalmente grande (skew) em várias tasks menores.

# ambos true por padrão no Spark 3.2+, mas confira explicitamente spark.sql.adaptive.enabled=true spark.sql.adaptive.coalescePartitions.enabled=true

Por que ele silenciosamente não faz nada

Os dois culpados mais comuns: spark.sql.adaptive.enabled definido explicitamente como false em algum config compartilhado, ou spark.sql.shuffle.partitions fixado junto com coalescePartitions.enabled=false - o que desativa o único mecanismo que o AQE aplica automaticamente em quase todo job. Nenhum dos dois aparece como erro; o job simplesmente roda exatamente como rodaria no Spark 2.x.

Onde o AQE não consegue te salvar

O AQE só se adapta depois de um limite de shuffle - um job de um único estágio sem shuffle não ganha nada com ele, e um job cujo particionamento inicial é ruim bem antes de qualquer shuffle ainda paga esse custo antecipadamente. O AQE conserta o que acontece depois de um shuffle, não se a leitura em si foi particionada de forma sensata.

Veja como isso fica no seu próprio pipeline.

Envie um event log real do Spark, um run_results.json do dbt ou uma exportação de métricas do Flink e receba recomendações concretas, para aprovar antes de aplicar - não mais uma regra geral.