Configurar as definições do Apache Spark

Um cluster HDInsight Spark inclui uma instalação da biblioteca Apache Spark. Cada cluster HDInsight inclui parâmetros de configuração padrão para todos os seus serviços instalados, incluindo o Spark. Um aspeto fundamental do gerenciamento de um cluster HDInsight Apache Hadoop é o monitoramento da carga de trabalho, incluindo Spark Jobs. Para melhor executar os trabalhos do Spark, considere a configuração do cluster físico ao determinar a configuração lógica do cluster.

O cluster padrão do HDInsight Apache Spark inclui os seguintes nós: três nós do Apache ZooKeeper, dois nós principais e um ou mais nós de trabalho:

Spark HDInsight Architecture.

O número de VMs e tamanhos de VM para os nós no cluster HDInsight pode afetar a configuração do Spark. Os valores de configuração do HDInsight não padrão geralmente exigem valores de configuração do Spark não padrão. Quando você cria um cluster HDInsight Spark, são mostrados tamanhos de VM sugeridos para cada um dos componentes. Atualmente, os tamanhos de VM Linux otimizada para memória para o Azure são D12 v2 ou superior.

Versões do Apache Spark

Use a melhor versão do Spark para seu cluster. O serviço HDInsight inclui várias versões do Spark e do próprio HDInsight. Cada versão do Spark inclui um conjunto de configurações de cluster padrão.

Quando você cria um novo cluster, há várias versões do Spark para escolher. Para ver a lista completa, Componentes e versões do HDInsight.

Nota

A versão padrão do Apache Spark no serviço HDInsight pode ser alterada sem aviso prévio. Se você tiver uma dependência de versão, a Microsoft recomenda que você especifique essa versão específica ao criar clusters usando o SDK do .NET, o Azure PowerShell e a CLI Clássica do Azure.

O Apache Spark tem três locais de configuração do sistema:

  • As propriedades do Spark controlam a maioria dos parâmetros do aplicativo e podem ser definidas usando um SparkConf objeto ou através das propriedades do sistema Java.
  • As variáveis de ambiente podem ser usadas para definir configurações por máquina, como o endereço IP, através do conf/spark-env.sh script em cada nó.
  • O registo pode ser configurado através do log4j.properties.

Quando você seleciona uma versão específica do Spark, o cluster inclui as definições de configuração padrão. Você pode alterar os valores de configuração padrão do Spark usando um arquivo de configuração personalizado do Spark. Apresentamos um exemplo abaixo.

spark.hadoop.io.compression.codecs org.apache.hadoop.io.compress.GzipCodec
spark.hadoop.mapreduce.input.fileinputformat.split.minsize 1099511627776
spark.hadoop.parquet.block.size 1099511627776
spark.sql.files.maxPartitionBytes 1099511627776
spark.sql.files.openCostInBytes 1099511627776

O exemplo mostrado acima substitui vários valores padrão para cinco parâmetros de configuração do Spark. Esses valores são o codec de compressão, o tamanho mínimo dividido do Apache Hadoop MapReduce e os tamanhos dos blocos de parquet. Além disso, a partição Spark SQL e os valores padrão de tamanhos de arquivo abertos. Essas alterações de configuração são escolhidas porque os dados e trabalhos associados (neste exemplo, dados genômicos) têm características particulares. Essas características farão melhor usando essas definições de configuração personalizadas.


Exibir definições de configuração do cluster

Verifique as definições de configuração atuais do cluster HDInsight antes de fazer a otimização de desempenho no cluster. Inicie o Painel do HDInsight no portal do Azure clicando no link Painel no painel de cluster do Spark. Entre com o nome de usuário e a senha do administrador do cluster.

A interface do usuário da Web do Apache Ambari é exibida, com um painel das principais métricas de uso de recursos do cluster. O Ambari Dashboard mostra a configuração do Apache Spark e outros serviços instalados. O Painel inclui uma guia Histórico de Configuração, onde você visualiza informações sobre os serviços instalados, incluindo o Spark.

Para ver os valores de configuração do Apache Spark, selecione Config History e, em seguida, selecione Spark2. Selecione a guia Configurações e, em seguida, selecione o link (ou Spark2, dependendo da Spark sua versão) na lista de serviços. Você verá uma lista de valores de configuração para seu cluster:

Spark Configurations.

Para ver e alterar valores individuais de configuração do Spark, selecione qualquer link com "faísca" no título. As configurações do Spark incluem valores de configuração personalizados e avançados nestas categorias:

  • Padrões do Spark2 personalizado
  • Propriedades personalizadas do Spark2-metrics-properties
  • Advanced Spark2-defaults
  • Advanced Spark2-env
  • Substituição avançada do spark2-hive-site-override

Se você criar um conjunto não padrão de valores de configuração, seu histórico de atualizações ficará visível. Esse histórico de configuração pode ser útil para ver qual configuração não padrão tem desempenho ideal.

Nota

Para ver, mas não alterar, as definições comuns de configuração do cluster do Spark, selecione a guia Ambiente na interface da interface do usuário do Trabalho do Spark de nível superior.

Configurando executores do Spark

O diagrama a seguir mostra os principais objetos Spark: o programa de driver e seu Contexto Spark associado, e o gerenciador de cluster e seus n nós de trabalho. Cada nó de trabalho inclui um Executor, um cache e n instâncias de tarefa.

Cluster objects.

Os trabalhos do Spark usam recursos do trabalhador, especialmente memória, por isso é comum ajustar os valores de configuração do Spark para os executores do nó do trabalhador.

Três parâmetros-chave que geralmente são ajustados para ajustar as configurações do Spark para melhorar os requisitos do aplicativo são spark.executor.instances, spark.executor.corese spark.executor.memory. Um Executor é um processo iniciado para um aplicativo Spark. Um Executor é executado no nó de trabalho e é responsável pelas tarefas do aplicativo. O número de nós de trabalho e o tamanho do nó de trabalho determinam o número de executores e os tamanhos dos executores. Esses valores são armazenados nos spark-defaults.conf nós principais do cluster. Você pode editar esses valores em um cluster em execução selecionando Custom spark-defaults na interface do usuário da Web do Ambari. Depois de fazer alterações, você será solicitado pela interface do usuário a Reiniciar todos os serviços afetados.

Nota

Esses três parâmetros de configuração podem ser configurados no nível do cluster (para todos os aplicativos executados no cluster) e também especificados para cada aplicativo individual.

Outra fonte de informações sobre os recursos usados pelos Executores do Spark é a interface do usuário do aplicativo Spark. Na interface do usuário, os executores exibem as exibições Resumo e Detalhes da configuração e dos recursos consumidos. Determine se os valores dos executores devem ser alterados para todo o cluster ou para um conjunto específico de execuções de tarefas.

Spark Executors.

Ou você pode usar a API REST do Ambari para verificar programaticamente as definições de configuração do cluster HDInsight e Spark. Mais informações estão disponíveis na referência da API Apache Ambari no GitHub.

Dependendo da carga de trabalho do Spark, pode determinar que uma configuração não padrão do Apache Spark permite execuções de tarefas do Apache Spark mais otimizadas. Faça testes de benchmark com cargas de trabalho de exemplo para validar quaisquer configurações de cluster não padrão. Alguns dos parâmetros comuns que pode querer ajustar:

Parâmetro Description
--num-executores Define o número de executores.
--executor-cores Define o número de núcleos para cada executor. Recomendamos o uso de executores de médio porte, pois outros processos também consomem parte da memória disponível.
--memória executora Controla o tamanho da memória (tamanho da pilha) de cada executor no Apache Hadoop YARN, e você precisará deixar alguma memória para a sobrecarga de execução.

Aqui está um exemplo de dois nós de trabalho com valores de configuração diferentes:

Two node configurations.

A lista a seguir mostra os principais parâmetros de memória do executor Spark.

Parâmetro Description
spark.executor.memory Define a quantidade total de memória disponível para um executor.
spark.storage.memoryFraction (padrão ~60%) define a quantidade de memória disponível para armazenar RDDs persistentes.
spark.shuffle.memoryFraction (padrão ~20%) define a quantidade de memória reservada para shuffle.
spark.storage.unrollFraction e spark.storage.safetyFraction (totalizando ~30% da memória total) - esses valores são usados internamente pelo Spark e não devem ser alterados.

O YARN controla a soma máxima de memória usada pelos contêineres em cada nó do Spark. O diagrama a seguir mostra as relações por nó entre objetos de configuração YARN e objetos Spark.

YARN Spark Memory Management.

Alterar parâmetros de um aplicativo em execução no Jupyter Notebook

Os clusters de faísca no HDInsight incluem vários componentes por padrão. Cada um desses componentes inclui valores de configuração padrão, que podem ser substituídos conforme necessário.

Componente Description
Núcleo de faísca Spark Core, Spark SQL, APIs de streaming do Spark, GraphX e Apache Spark MLlib.
Anaconda Um gerenciador de pacotes Python.
Apache Lívio A API REST Apache Spark, usada para enviar trabalhos remotos para um cluster HDInsight Spark.
Notebooks Jupyter e Notebooks Apache Zeppelin Interface do usuário interativa baseada em navegador para interagir com o cluster do Spark.
Controlador ODBC Conecta clusters do Spark no HDInsight a ferramentas de business intelligence (BI), como o Microsoft Power BI e o Tableau.

Para aplicativos executados no Jupyter Notebook, use o %%configure comando para fazer alterações de configuração de dentro do próprio notebook. Essas alterações de configuração serão aplicadas aos trabalhos do Spark executados a partir da instância do seu bloco de anotações. Faça essas alterações no início do aplicativo, antes de executar sua primeira célula de código. A configuração alterada é aplicada à sessão do Livy quando ela é criada.

Nota

Para alterar a configuração em um estágio posterior no aplicativo, use o -f parâmetro (force). No entanto, todo o progresso na aplicação será perdido.

O código abaixo mostra como alterar a configuração de um aplicativo em execução em um Jupyter Notebook.

%%configure
{"executorMemory": "3072M", "executorCores": 4, "numExecutors":10}

Conclusão

Monitore as principais definições de configuração para garantir que seus trabalhos do Spark sejam executados de forma previsível e com desempenho. Essas configurações ajudam a determinar a melhor configuração de cluster do Spark para suas cargas de trabalho específicas. Você também precisará monitorar a execução de execuções de trabalhos do Spark de longa duração e/ou que consomem recursos. Os desafios mais comuns centram-se na pressão da memória de configurações inadequadas, como executores de tamanho incorreto. Além disso, operações de longa duração e tarefas, que resultam em operações cartesianas.

Próximos passos