Escalonamento automático de workload resource_allocation_properties

Este documento fornece informações sobre o escalonamento automático do Serviço Gerenciado para Apache Spark. Ao enviar sua carga de trabalho do Spark, o Serviço Gerenciado para Apache Spark pode escalonar dinamicamente os recursos da carga de trabalho, como o número de executores, para executar a carga de trabalho de maneira eficiente. O escalonamento automático do Serviço Gerenciado para Apache Spark é o comportamento padrão e usa a alocação dinâmica de recursos do Spark para determinar se, como e quando escalonar sua carga de trabalho.

Escalonamento automático V2 do Serviço Gerenciado para Apache Spark

A versão 2 (V2) do escalonamento automático do Serviço Gerenciado para Apache Spark adiciona recursos e melhorias à versão 1 (V1) padrão para ajudar você a gerenciar cargas de trabalho do Serviço Gerenciado para Apache Spark, melhorar o desempenho da carga de trabalho e economizar custos:

  • Redução de escala assíncrona de nós: o escalonamento automático V2 substitui a redução de escala síncrona do V1 por uma assíncrona. Com a redução de escala assíncrona, o Serviço Gerenciado para Apache Spark reduz escala vertical os recursos da carga de trabalho sem esperar que todos os nós concluam a migração de embaralhamento. Isso significa que os nós de cauda longa que reduzir escala vertical lentamente não bloqueiam o escalonamento vertical.
  • Seleção inteligente de nós para redução de escala: o escalonamento automático V2 substitui a seleção aleatória de nós da V1 por um algoritmo inteligente que identifica os melhores nós para reduzir escala vertical primeiro. Esse algoritmo considera fatores como o tamanho dos dados de embaralhamento e o tempo ocioso do nó.
  • Comportamento configurável de desativação gradual do Spark e migração de embaralhamento: o escalonamento automático V2 permite usar propriedades padrão do Spark para configurar a desativação gradual e a migração de embaralhamento do Spark. Esse recurso pode ajudar você a manter a compatibilidade da migração com suas propriedades personalizadas do Spark.

Recursos de escalonamento automático do Serviço Gerenciado para Apache Spark

Recurso Autoscaling V1 do Serviço Gerenciado para Apache Spark Escalonamento automático V2 do Serviço Gerenciado para Apache Spark
Redução de nós Síncrona Assíncrono
Seleção de nós para redução de escala Aleatório Inteligente
Desativação otimizada do Spark e migração de embaralhamento Não configurável Configurável

Propriedades de alocação dinâmica do Spark

A tabela a seguir lista as propriedades de alocação dinâmica do Spark que podem ser definidas ao enviar uma carga de trabalho em lote para controlar o escalonamento automático. Consulte como definir propriedades do Spark.

Propriedade Descrição Padrão
spark.dataproc.scaling.version A versão de escalonamento automático do Serviço Gerenciado para Apache Spark. Especifique a versão 1 ou 2. 1
spark.dynamicAllocation.enabled Se deve usar a alocação dinâmica de recursos, que aumenta e diminui o número de executores com base na carga de trabalho. Definir o valor como false desativa o escalonamento automático para a carga de trabalho. Padrão: true. true
spark.dynamicAllocation.initialExecutors O número inicial de executores alocados para a carga de trabalho. Depois que a carga de trabalho é iniciada, o escalonamento automático pode mudar o número de executores ativos. O valor mínimo é 2, e o máximo é 2000. 2
spark.dynamicAllocation.minExecutors O número mínimo de executores para reduzir a carga de trabalho. O valor mínimo é 2. 2
spark.dynamicAllocation.maxExecutors O número máximo de executores para escalonar a carga de trabalho. O valor máximo é 2000. 1000
spark.dynamicAllocation.executorAllocationRatio Personaliza o escalonamento vertical da carga de trabalho do Spark. Aceita um valor de 0 a 1. Um valor de 1.0 oferece capacidade máxima de expansão e ajuda a alcançar o paralelismo máximo. Um valor de 0.5 define a capacidade de escalonamento vertical e o paralelismo na metade do valor máximo. 0.3
spark.dynamicAllocation.diagnosis.enabled Quando true, as informações de diagnóstico são registradas se os executores em execução excederem os executores máximos necessários para o período especificado por spark.dynamicAllocation.diagnosis.interval. O diagnóstico inclui um resumo do executor com contagem de executores ociosos e percentis de tempo ocioso, distribuição de tarefas ativas, tamanho dos dados de embaralhamento e tamanho do RDD em cache. Use spark.dynamicAllocation.diagnosis.logLevel para controlar o nível de registro de saída. false
spark.dynamicAllocation.profile Defina como performance ou cost para aplicar um conjunto predefinido de configurações otimizadas para desempenho ou custo-benefício. As propriedades definidas pelo usuário substituem os padrões do perfil. Consulte Perfis de alocação dinâmica do Spark para mais detalhes. none
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled Quando true, ativa o cálculo dinâmico de tempo limite para executores que contêm dados de embaralhamento. Em vez de usar o spark.dynamicAllocation.shuffleTracking.timeout estático, o tempo limite é calculado com base na quantidade de dados de embaralhamento armazenados no executor. Isso permite que executores com pequenas transferências sejam liberados mais rapidamente, mantendo os executores com grandes transferências ativos por mais tempo. false
spark.reducer.fetchMigratedShuffle.enabled Quando definido como true, permite buscar o local de saída do embaralhamento no driver do Spark depois que uma busca falha em um executor desativado devido à alocação dinâmica do Spark. Isso reduz os erros ExecutorDeadException causados pela migração de blocos de embaralhamento de executores desativados para executores ativos e reduz as novas tentativas de estágio causadas por erros FetchFailedException. Consulte FetchFailedException causado por ExecutorDeadException. Essa propriedade está disponível no Serviço gerenciado para Apache Spark versões do ambiente de execução do Spark 1.1.12 e posteriores e 2.0.20 e posteriores. false
spark.scheduler.excludeShuffleSkewExecutors Quando true, evita o agendamento de tarefas em executores com distorção de embaralhamento, que são executores com uma grande quantidade de dados de embaralhamento ou um grande número de tarefas de mapa concluídas. Isso pode melhorar a performance ao reduzir a distorção de embaralhamento. false

Perfis de alocação dinâmica do Spark

Você pode definir a propriedade spark.dynamicAllocation.profile como performance ou cost para aplicar um conjunto predefinido de configurações do Spark otimizadas para desempenho ou custo-benefício. Se você definir propriedades do Spark além da propriedade spark.dynamicAllocation.profile, suas configurações vão substituir os padrões do perfil para essas propriedades.

performance: esse perfil otimiza o tempo mínimo de execução aplicando as seguintes configurações padrão:

  • spark.scheduler.excludeShuffleSkewExecutors: true
  • spark.dynamicAllocation.executorIdleTimeout: 300s
  • spark.dynamicAllocation.initialExecutors: 10

cost: esse perfil otimiza o consumo reduzido de recursos aplicando as seguintes configurações padrão:

  • spark.dynamicAllocation.executorIdleTimeout: 120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout: 120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled: true
  • spark.dynamicAllocation.diagnosis.enabled: true

Métricas de alocação dinâmica do Spark

As cargas de trabalho em lote do Spark geram as seguintes métricas relacionadas à alocação dinâmica de recursos do Spark. Para mais informações sobre métricas do Spark, consulte Monitoramento e instrumentação.

Métrica Descrição
maximum-needed O número máximo de executores necessários na carga atual para atender a todas as tarefas em execução e pendentes.
running O número de executores em execução que estão executando tarefas.

Problemas e soluções de alocação dinâmica do Spark

  • FetchFailedException causada por ExecutorDeadException

    Causa: quando a alocação dinâmica do Spark reduz um executor, o arquivo de embaralhamento é migrado para executores ativos. No entanto, como a tarefa de redução do Spark em um executor busca a saída de embaralhamento do local definido pelo driver do Spark quando a tarefa de redução é iniciada, se um arquivo de embaralhamento for migrado, o redutor poderá continuar tentando buscar a saída de embaralhamento de um executor desativado, causando erros de ExecutorDeadException e FetchFailedException.

    Solução: ative a nova busca do local de embaralhamento definindo spark.reducer.fetchMigratedShuffle.enabled como true ao executar sua carga de trabalho em lote do Serviço Gerenciado para Apache Spark (consulte Definir propriedades da carga de trabalho em lote do Spark). Quando essa propriedade está ativada, a tarefa do redutor busca novamente o local de saída do embaralhamento do driver depois que uma busca de um executor desativado falha.