Configurar o desempenho da computação

Concluído

A configuração de recursos de computação envolve o balanceamento dos requisitos de desempenho com considerações de custo. O excesso de provisionamento leva a despesas desnecessárias, enquanto o subprovisionamento pode causar problemas de estabilidade e execução lenta da consulta. Entender como definir as configurações de computação ajuda você a otimizar recursos para sua carga de trabalho.

Entender os componentes de recursos de computação

O desempenho da computação depende de três fatores-chave trabalhando juntos. Cada fator influencia a eficiência com que sua carga de trabalho é executada e quanto custa.

Diagrama mostrando a relação entre núcleos, memória e armazenamento.

O total de núcleos do executor determina o paralelismo máximo disponível para o processamento de dados. Mais núcleos permitem que o Spark processe mais tarefas simultaneamente. Um cluster com 8 trabalhadores, cada um com 4 núcleos, fornece um total de 32 núcleos para processamento paralelo.

A memória total do executor afeta a quantidade de dados que podem ser processados na memória antes de derramar em disco. Operações com uso intensivo de memória, como junções e agregações, se beneficiam de configurações de memória maiores. Quando a memória se esgota, o Spark grava dados no disco, o que reduz significativamente o desempenho.

O armazenamento local fornece espaço temporário para operações de ordenação e cache. Durante operações shuffle, o Spark grava dados intermediários em discos locais nos nós de trabalho. O armazenamento local rápido reduz o tempo gasto nessas operações.

Com essa compreensão dos componentes de computação, você pode tomar decisões informadas sobre tipos de nós e o tamanho do cluster.

Configurar tipos de nodos e tamanho do cluster

A seleção de tipo de nó afeta diretamente o desempenho e o custo. Famílias de instâncias diferentes atendem a diferentes características de carga de trabalho.

As instâncias com otimização de memória funcionam bem para cargas de trabalho com grandes junções, agregações ou dados que precisam permanecer na memória. Essas instâncias fornecem mais RAM por núcleo, reduzindo a probabilidade de derramar dados em disco. Exemplos incluem VMs da série E , que oferecem altas taxas de memória para núcleo ideais para análise na memória.

Instâncias com otimização de computação atendem a cargas de trabalho que executam cálculos complexos , mas não exigem grandes quantidades de memória. Trabalhos ETL com transformações simples geralmente são executados com eficiência nessas instâncias. Exemplos incluem VMs da série F , que fornecem alto desempenho de CPU com menores taxas de memória.

Instâncias com otimização de armazenamento beneficiam cargas de trabalho que leem repetidamente os mesmos dados ou exigem acesso rápido ao disco local. As cargas de trabalho de análise de dados com cache habilitado têm um desempenho melhor com essas instâncias. Os exemplos incluem VMs da série L , que oferecem armazenamento NVMe local rápido para cargas de trabalho de E/S altas.

As instâncias aceleradas por GPU fornecem unidades de processamento de gráficos projetadas para cargas de trabalho computacionalmente intensivas, como aprendizado de máquina, aprendizado profundo e processamento de imagens. Essas instâncias podem acelerar o treinamento de modelos de 10 a 100x em comparação com clusters somente de CPU. Exemplos incluem VMs das séries NC e ND com GPUs NVIDIA. As instâncias de GPU exigem o Databricks Runtime ML e funcionam melhor para tarefas como treinar redes neurais, ajustar modelos de linguagem grandes ou executar inferência em modelos complexos.

Captura de tela da criação do cluster do Azure Databricks, com foco nos recursos de desempenho.

O equilíbrio entre o número de trabalhadores e o tamanho da instância afeta o desempenho de forma diferente, dependendo da carga de trabalho. Dois trabalhadores com 16 núcleos e 128 GB de RAM fornecem a mesma computação e memória totais que oito trabalhadores com 4 núcleos e 32 GB de RAM cada. No entanto, a configuração com menos nós maiores reduz o tráfego de rede durante operações de shuffle, enquanto mais nós menores podem fornecer melhor paralelismo para cargas de trabalho altamente distribuídas.

Para cargas de trabalho analíticas com muitas operações de shuffle, menos trabalhadores maiores normalmente têm um desempenho melhor. Para o processamento em lote simples que se beneficia do alto paralelismo, mais trabalhadores menores podem ser mais econômicos.

Usar tipos de nó flexíveis

Quando Azure Databricks inicia um recurso de computação, o provedor de nuvem pode ocasionalmente ficar sem capacidade para o tipo de instância especificado. Isso resulta em um CLOUD_PROVIDER_RESOURCE_STOCKOUT erro, que pode atrasar ou falhar na execução do trabalho sem aviso.

Os tipos de nó flexíveis resolvem isso voltando automaticamente para tipos de instância alternativa compatíveis quando o tipo preferencial não está disponível. Alternativas compatíveis compartilham a mesma contagem de vCPU, memória (dentro de 100 a 110%), configuração de disco local, arquitetura de CPU e suporte de imagem do sistema operacional como o tipo de instância primária , garantindo que sua carga de trabalho seja executada corretamente, independentemente de qual tipo seja adquirido.

Os administradores do workspace ativam esse recurso ao alternar Ativar tipos de nó flexíveis automáticos nas configurações de administrador da Computação no workspace. Uma vez habilitados, todos os novos recursos de computação clássicos usam automaticamente tipos de instância de fallback. Isso é bom para instâncias spot: tipos de nó flexíveis podem tentar a aquisição em vários tipos compatíveis antes de recorrer a instâncias sob demanda, aumentando a porcentagem de instâncias spot usadas e reduzindo o custo total de computação.

Para cargas de trabalho com requisitos estritos de tipo de instância, você pode desabilitar tipos de nó flexíveis para um recurso computacional individual definindo alternate_node_type_ids como uma lista vazia por meio da API de Clusters. Você também pode especificar uma lista de fallback personalizada por meio da API se preferir controlar quais tipos alternativos são usados em vez de depender da seleção automática.

Configurar o dimensionamento automático

O dimensionamento automático ajusta o número de trabalhadores com base nas demandas de carga de trabalho, ajudando você a manter o desempenho enquanto controla os custos.

Ao habilitar o dimensionamento automático, você define o número mínimo e máximo de trabalhadores. O Azure Databricks monitora os requisitos de carga de trabalho e adiciona trabalhadores quando necessário, até o máximo especificado. Quando a demanda diminui, os trabalhadores são removidos ao mínimo.

O Azure Databricks usa o dimensionamento automático otimizado por padrão quando você habilita o dimensionamento automático. O dimensionamento automático otimizado aumenta rapidamente em duas etapas do mínimo para o máximo. Eles podem escalar verticalmente mesmo quando o cluster não está ocioso, monitorando o estado do arquivo shuffle. Para computação de trabalho, ele avalia a utilização a cada 40 segundos. Para computação para todos os fins, ele verifica a cada 150 segundos.

Considere o dimensionamento automático para cargas de trabalho com necessidades de recursos variáveis durante toda a execução. As sessões de exploração de dados geralmente começam com amostras de dados pequenas e, posteriormente, processam conjuntos de dados maiores. O dimensionamento automático adiciona trabalhadores quando você processa os conjuntos de dados maiores e os remove quando você retorna a amostras menores.

Para cargas de trabalho previsíveis que mantêm o uso consistente de recursos, um número fixo de trabalhadores geralmente fornece um desempenho mais estável e um planejamento de capacidade mais simples. A sobrecarga de decisões de dimensionamento pode afetar ligeiramente o desempenho de cargas de trabalho de estado estável.

O dimensionamento automático funciona especialmente bem com conjuntos de instâncias. Defina um número de trabalhadores mínimos igual ou menor que as instâncias ociosas mínimas no pool. Isso garante o dimensionamento rápido porque as instâncias já estão provisionadas e prontas.

Definir configurações de terminação

O encerramento automático impede que os recursos de computação ociosos acumulem custos desnecessários, mantendo a disponibilidade para cargas de trabalho agendadas.

Ao configurar a terminação automática, especifique um período de inatividade em minutos. Se nenhum comando for executado no cluster por mais tempo do que esse período, o Azure Databricks encerrará o cluster. A configuração do cluster permanece disponível para reinicialização quando necessário.

Para cargas de trabalho interativas, como análise de dados, defina o período de término com base em padrões de sessão típicos. Um tempo limite de 45 minutos funciona bem para a maioria dos casos de uso, dando aos engenheiros de dados tempo para revisar os resultados entre consultas sem deixar clusters ociosos por horas.

Para computação de trabalho, o encerramento automático ocorre após a conclusão do trabalho. O cluster é iniciado automaticamente quando a próxima execução agendada começa, portanto, você não precisa gerenciar a inicialização manualmente.

As instâncias spot reduzem os custos, mas apresentam limitações em termos de disponibilidade. O Azure pode reivindicar instâncias spot quando a capacidade é necessária em outras áreas. Para nós de trabalho, as instâncias spot funcionam bem porque o Azure Databricks/Spark pode lidar com falhas dos nós de trabalho. No entanto, sempre use instâncias sob demanda para nós de driver. Se o driver for recuperado, todo o cluster falhará.

Habilite o descomissionamento ao usar instâncias spot para reduzir falhas nas tarefas. Quando uma instância spot recebe um aviso de preempção, a desativação migra dados de shuffle e armazenados em cache para trabalhadores saudáveis antes que a instância seja encerrada. Isso reduz a necessidade de recompilar dados perdidos.

Usar grupos de instâncias

Os pools de instâncias mantêm um conjunto de instâncias ociosas prontas para uso imediato, reduzindo o tempo de inicialização do cluster de minutos para segundos.

Diagrama explicando o uso de pools de instâncias do Azure Databricks.

Configure as instâncias ociosas mínimas para corresponder às suas necessidades típicas de clusters em execução simultânea. Se você executar regularmente três notebooks simultaneamente, mantenha disponíveis pelo menos três instâncias ociosas. Essas instâncias permanecem disponíveis mesmo quando não estão em uso, fornecendo inicialização instantânea do cluster.

Captura de tela do Pool de Instâncias do Azure Databricks.

Defina a capacidade máxima para controlar os custos e impedir que uma carga de trabalho consuma todos os recursos disponíveis. Quando várias equipes compartilham um workspace, os pools com configurações máximas de capacidade garantem uma distribuição justa de recursos. Por exemplo, com uma cota de 100 instâncias, você pode criar dois pools cada um com um máximo de 50 instâncias para duas equipes.

A configuração de encerramento automático da instância ociosa remove instâncias que excedem sua contagem mínima de ociosidade após o período especificado. Se você definir o tempo ocioso mínimo para 3 e a terminação automática para 30 minutos, um pool que escala até 8 instâncias será reduzido novamente para 3 instâncias após 30 minutos de inatividade.

Pré-carregar uma versão do Databricks Runtime em instâncias de pool acelera ainda mais as inicializações de cluster. Ao criar um cluster, se você selecionar o runtime pré-carregado, o cluster será iniciado quase imediatamente porque o runtime já está instalado em instâncias ociosas.

Os pools funcionam melhor para cargas de trabalho com ciclos frequentes de criação e encerramento de cluster. As equipes de desenvolvimento que criam e destroem clusters ao longo do dia veem uma economia significativa de tempo. Trabalhos de produção que são executados em clusters dedicados de longa duração não se beneficiam tanto dos pools.

Balancear o custo e o desempenho

Alcançar o equilíbrio certo entre custo e desempenho requer entender as características da carga de trabalho e ajustar as configurações adequadamente.

Comece com configurações conservadoras e monitore o desempenho. Se você notar transbordo frequente para o disco ou execução lenta de consultas, aumente a memória ou a quantidade de núcleos. Se a utilização permanecer baixa, reduza o tamanho do cluster ou habilite o dimensionamento automático.

Observação

Use a interface do usuário do Spark para identificar problemas de desempenho. Verifique a Linha do Tempo de Trabalhos para localizar estágios de execução prolongada e exiba a página de detalhes do estágio para obter estatísticas de despejo mostrando Despejo de Shuffle (Memória) e Despejo de Shuffle (Disco). Compare as durações dos estágios para identificar gargalos e consultas ao banco de dados lentas.

Use a computação sem servidor quando sua carga de trabalho der suporte a ela. Arquitetura serverless elimina decisões de configuração e dimensiona-se automaticamente com base na demanda, geralmente proporcionando o melhor equilíbrio entre custo e desempenho sem a necessidade de ajuste manual.

O monitoramento regular ajuda a identificar oportunidades de otimização. Examine as métricas do cluster para ver a utilização real em comparação com a capacidade provisionada. Ajuste tipos de nós, números de trabalhadores ou ajustes de dimensionamento baseado em padrões observados em vez de suposições.

Observação

O monitoramento e a observabilidade são abordados em detalhes em um módulo posterior.