Otimizar aplicações do Apache Spark no HDInsight

Este artigo fornece uma descrição geral das estratégias para otimizar as aplicações do Apache Spark no Azure HDInsight.

Descrição Geral

Pode enfrentar cenários comuns abaixo

  • A mesma tarefa do Spark é mais lenta do que antes no mesmo cluster do HDInsight
  • A tarefa do Spark é mais lenta no cluster do HDInsight do que no local ou noutro fornecedor de serviços de terceiros
  • A tarefa do Spark é mais lenta num cluster HDI do que noutro cluster HDI

O desempenho das tarefas do Apache Spark depende de vários fatores. Estes fatores de desempenho incluem:

  • Como os seus dados são armazenados
  • Como o cluster está configurado
  • As operações que são utilizadas ao processar os dados.
  • Serviço yarn em mau estado de funcionamento
  • Restrições de memória devido a executores de tamanho impróprio e OutOfMemoryError
  • Demasiadas tarefas ou poucas tarefas
  • A distorção de dados causou algumas tarefas pesadas ou tarefas lentas
  • Tarefas mais lentas em nós incorretos

Passo 1: verificar se o serviço yarn está em bom estado de funcionamento

  1. Aceda à IU do Ambari:
  • Verificar se o ResourceManager ou o NodeManager são alertas
  • Verifique o estado resourceManager e NodeManager no RESUMO do YARN > : Todos os NodeManager devem estar em Iniciado e apenas o ResourceManager Ativo deve estar em Iniciado
  1. Verificar se a IU do Yarn está acessível através de https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster

  2. Verificar se existem exceções ou erros no início de sessão do ResourceManager /var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log

Ver mais informações em Problemas Comuns do Yarn

Passo 2: Comparar os novos recursos da aplicação com os recursos disponíveis no yarn

  1. Aceda a RESUMO DO YARN > da IU > do Ambari, verifique MEMÓRIA do CLUSTER no ServiceMetrics

  2. Verifique as métricas da fila de yarn em detalhes:

  • Aceda à IU do Yarn, verifique as métricas do agendador do Yarn https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster/scheduler
  • Em alternativa, pode verificar as métricas do agendador de yarn através da API Rest do Yarn. Por exemplo, curl -u "xxxx" -sS -G "https://YOURCLUSTERNAME.azurehdinsight.net/ws/v1/cluster/scheduler". Para ESP, deve utilizar o utilizador administrador de domínio.
  1. Calcular o total de recursos da sua nova aplicação
  • Todos os recursos dos executores: spark.executor.instances * (spark.executor.memory + spark.yarn.executor.memoryOverhead) and spark.executor.instances * spark.executor.cores. Ver mais informações na configuração dos executores do Spark
  • ApplicationMaster
    • No modo de cluster, utilize spark.driver.memory e spark.driver.cores
    • No modo de cliente, utilize spark.yarn.am.memory+spark.yarn.am.memoryOverhead e spark.yarn.am.cores

Nota

yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb

  1. Comparar o total de recursos da nova aplicação com os recursos disponíveis no yarn na fila especificada

Passo 3: controlar a sua aplicação spark

  1. Monitorizar a aplicação spark em execução através da IU do Spark

  2. Monitorizar a sua aplicação spark completa ou incompleta através da IU do Servidor do Histórico do Spark

Temos de identificar os sintomas abaixo através da IU do Spark ou da IU do Histórico do Spark:

  • Que fase é lenta
  • O total de núcleos virtuais da CPU do executor é totalmente utilizado no Event-Timeline no separador Fase
  • Se utilizar o spark sql, qual é o plano físico no separador SQL
  • O DAG é demasiado longo numa fase
  • Observe as métricas das tarefas (tamanho da entrada, tamanho da escrita aleatória, Hora do GC) no separador Fase

Ver mais informações em Monitorizar as Aplicações do Spark

Passo 4: Otimizar a aplicação Spark

Existem muitas otimizações que podem ajudá-lo a superar estes desafios, como a colocação em cache e a permitir a distorção de dados.

Em cada um dos seguintes artigos, pode encontrar informações sobre diferentes aspetos da otimização do Spark.

Otimizar partições SQL do Spark

  • spark.sql.shuffle.paritions é 200 por predefinição. Podemos ajustar-nos com base nas necessidades empresariais ao misturar dados para associações ou agregações.
  • spark.sql.files.maxPartitionBytes é 1G por predefinição no HDI. O número máximo de bytes a empacotar numa única partição ao ler ficheiros. Esta configuração só é eficaz quando utiliza origens baseadas em ficheiros, como Parquet, JSON e ORC.
  • AQE no Spark 3.0. Veja Execução de Consultas Adaptável

Passos seguintes