Partilhar via


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:

Arquitetura do Spark HDInsight.

O número de VMs e o tamanho das VMs 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 VMs Linux otimizadas 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 script conf/spark-env.sh 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, os valores padrão para a partição do Spark SQL e os tamanhos de arquivo para abertura. 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 desempenharão melhor com estas configurações 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 em Dashboard na criação de clusters 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 de Controlo inclui um separador Histórico de Configuração, onde vê 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 o separador Configurações, e em seguida selecione o Spark link (ou Spark2 link, dependendo da versão) na lista de serviços. Você verá uma lista de valores de configuração para seu cluster:

Configurações do Spark.

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

  • Definições personalizadas do Spark2
  • Propriedades personalizadas de Spark2-metrics-properties
  • Predefinidos avançados do Spark2
  • 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 de nível superior da Tarefa Spark.

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.

Objetos de cluster.

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

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 os tamanhos dos nós de trabalho determinam o número de executores e os tamanhos dos executores. Estes valores são armazenados nos nós principais do cluster spark-defaults.conf. 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.

Executores de faísca.

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 Descrição
--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, sendo necessário 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:

Duas configurações de nós.

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

Parâmetro Descrição
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.

Gerenciamento de memória YARN Spark.

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 Descrição
Spark Core 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.
Jupyter Notebooks e Apache Zeppelin Notebooks 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 notebook. 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 num estágio posterior na aplicação, use o parâmetro -f (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 de memória resultante de configurações inadequadas, como por exemplo executores configurados com tamanhos incorretos. Além disso, operações de longa duração e tarefas que resultam em operações cartesianas.

Próximos passos