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
- 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
Verificar se a IU do Yarn está acessível através de
https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster
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
Aceda a RESUMO DO YARN > da IU > do Ambari, verifique MEMÓRIA do CLUSTER no ServiceMetrics
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.
- 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
espark.driver.cores
- No modo de cliente, utilize
spark.yarn.am.memory+spark.yarn.am.memoryOverhead
espark.yarn.am.cores
- No modo de cluster, utilize
Nota
yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb
- 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
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 o armazenamento de dados para o Apache Spark
- Otimizar o processamento de dados para o Apache Spark
- Otimizar a utilização da memória para o Apache Spark
- Otimizar a configuração do cluster do HDInsight para o Apache 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