Configurar o desempenho de computação
Configurar recursos de computação envolve equilibrar requisitos de desempenho com considerações de custo. O excesso de provisionamento resulta em despesas desnecessárias, enquanto o sub-provisionamento pode causar problemas de estabilidade e uma execução lenta das consultas. Compreender como configurar as definições de computação ajuda-o a otimizar os recursos para a sua carga de trabalho.
Compreender os componentes dos recursos computacionais
O desempenho computacional depende de três fatores-chave a trabalharem em conjunto. Cada fator influencia a eficiência da sua carga de trabalho e o seu custo.
O total de núcleos executores 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 serem transferidos para o disco. Operações intensivas em memória, como joins e agregações, beneficiam de configurações de memória maiores. Quando a memória acaba, o Spark escreve os dados no disco, o que reduz significativamente o desempenho.
O armazenamento local fornece espaço temporário para operações de shuffle e cache. Durante operações de embaralhamento, o Spark escreve dados intermediários em discos locais nos nós de trabalho. O armazenamento local rápido reduz o tempo gasto nestas operações.
Com esta compreensão dos componentes de computação, pode tomar decisões informadas sobre tipos de nós e tamanho do cluster.
Configurar os tipos de nós e o tamanho do cluster
A seleção do tipo de nó impacta diretamente tanto o desempenho como o custo. Diferentes famílias de instâncias servem diferentes características de carga de trabalho.
As instâncias otimizadas para memória funcionam bem para cargas de trabalho com joins grandes, agregações ou dados que precisam de permanecer na memória. Estas instâncias fornecem mais RAM por núcleo, reduzindo a probabilidade de derramar dados para o disco. Exemplos incluem VMs da série E , que oferecem elevadas proporções memória-núcleo ideais para análise em memória.
As instâncias otimizadas para computação adequam-se a cargas de trabalho que realizam cálculos complexos, mas não requerem grandes quantidades de memória. Os trabalhos ETL com transformações simples costumam correr eficientemente nestas instâncias. Exemplos incluem as VMs da série F , que oferecem alto desempenho de CPU com rácios de memória mais baixos.
As instâncias otimizadas para armazenamento beneficiam cargas de trabalho que leem repetidamente os mesmos dados ou requerem acesso rápido ao disco local. Cargas de trabalho de análise de dados com cache ativado têm melhor desempenho nestas instâncias. Exemplos incluem as VMs da série L, que oferecem armazenamento NVMe local rápido para cargas de trabalho elevadas de I/O.
As instâncias aceleradas por GPU fornecem unidades de processamento gráfico concebidas para cargas de trabalho computacionalmente intensivas, como machine learning, deep learning e processamento de imagens. Estas instâncias podem acelerar o treino de modelos entre 10 a 100 vezes em comparação com clusters apenas com CPU. Exemplos incluem VMs das séries NC e ND com GPUs NVIDIA. As instâncias de GPU requerem Databricks Runtime ML e funcionam melhor para tarefas como treino de redes neurais, ajuste fino de grandes modelos de linguagem ou execução de inferência em modelos complexos.
O equilíbrio entre o número de trabalhadores e o tamanho da instância afeta o desempenho de forma diferente consoante a sua carga de trabalho. Dois trabalhadores com 16 núcleos e 128 GB de RAM fornecem cada um o mesmo total de computação e memória que oito trabalhadores com 4 núcleos e 32 GB de RAM cada. No entanto, a configuração com menos trabalhadores maiores reduz o tráfego de rede durante operações de embaralhamento, enquanto trabalhadores mais pequenos podem proporcionar melhor paralelismo para cargas de trabalho altamente distribuídas.
Para cargas de trabalho analíticas com muitas operações de embaralhamento, normalmente há menos trabalhadores de grande porte que têm um desempenho melhor. Para processamento em lote simples que beneficia de elevado paralelismo, mais trabalhadores mais pequenos podem ser mais económicos.
Utilizar tipos de nós flexíveis
Quando o Azure Databricks lança um recurso de computação, o seu fornecedor de cloud pode, por vezes, ficar sem capacidade para o tipo de instância especificado. Isto resulta num CLOUD_PROVIDER_RESOURCE_STOCKOUT erro, que pode atrasar ou falhar a execução do trabalho sem aviso.
Os tipos de nós flexíveis resolvem isto recorrendo automaticamente a tipos de instância alternativos compatíveis quando o tipo preferido não está disponível. Alternativas compatíveis partilham o mesmo número de vCPU, memória (dentro de 100–110%), configuração do disco local, arquitetura de CPU e suporte para imagem do sistema operativo como o tipo principal de instância — garantindo que a sua carga de trabalho funciona corretamente, independentemente do tipo adquirido.
Os administradores do espaço de trabalho ativam esta funcionalidade ao alternar Ativar tipos de nós flexíveis automáticos nas definições de administração de Computação do espaço de trabalho. Uma vez ativados, todos os novos recursos de computação clássica passam a utilizar automaticamente tipos de instância de contingência. Isto é particularmente valioso para instâncias spot: tipos de nós flexíveis podem tentar aquisição entre múltiplos tipos compatíveis antes de recaírem para on-demand, aumentando a percentagem de instâncias spot usadas e reduzindo os custos totais de computação.
Para cargas de trabalho com requisitos rigorosos de tipos de instância, pode desativar tipos de nós flexíveis para um recurso de computação individual definindo alternate_node_type_ids como uma lista vazia através da API Clusters. Também pode especificar uma lista de backup personalizada através da API se preferir controlar quais os tipos alternativos usados em vez de depender da seleção automática.
Configurar o dimensionamento automático
O autoscaling ajusta o número de trabalhadores com base nas exigências de trabalho, ajudando-o a manter o desempenho enquanto controla os custos.
Quando ativas o autoscaling, defines o número mínimo e máximo de trabalhadores. O Azure Databricks monitoriza os requisitos de carga de trabalho e adiciona trabalhadores quando necessário, até ao máximo que especificaste. Quando a procura diminui, os trabalhadores são removidos até ao mínimo.
O Azure Databricks utiliza escalamento automático otimizado por padrão quando ativado o escalamento automático. A escalabilidade automática otimizada aumenta rapidamente em dois passos, do valor mínimo ao máximo. Pode reduzir mesmo quando o cluster não está inativo, monitorizando o estado do ficheiro de embaralhar. Para o cálculo de tarefas, avalia a utilização a cada 40 segundos. Para computação para todos os usos, verifica a cada 150 segundos.
Considere o autoescalonamento para cargas de trabalho com necessidades variáveis de recursos ao longo da execução. As sessões de exploração de dados frequentemente começam com pequenas amostras de dados e mais tarde processam conjuntos de dados maiores. O autoescalonamento adiciona trabalhadores quando processa os conjuntos de dados maiores e remove-os quando regressa a amostras mais pequenas.
Para cargas de trabalho previsíveis que mantêm uma utilização consistente de recursos, um número fixo de trabalhadores proporciona frequentemente um desempenho mais estável e um planeamento de capacidade mais simples. A sobrecarga das decisões de escalabilidade pode afetar ligeiramente o desempenho para cargas de trabalho em regime estacionário.
O escalonamento automático funciona particularmente bem com pools de instâncias. Defina o mínimo de trabalhadores igual ou inferior ao mínimo de instâncias inativas no pool. Isto garante uma escalabilidade rápida porque as instâncias já estão provisionadas e prontas.
Configurar definições de terminação
A terminação automática impede que os recursos computacionais inativos acumulem custos desnecessários, mantendo a disponibilidade para cargas de trabalho agendadas.
Quando configura a terminação automática, especifica 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 termina o cluster. A configuração do cluster mantém-se disponível para reinício quando necessário.
Para cargas de trabalho interativas como análise de dados, defina o período de terminação com base nos padrões típicos de sessão. Um timeout de 45 minutos funciona bem para a maioria dos casos de uso, dando aos engenheiros de dados tempo para rever os resultados entre consultas sem deixar os clusters inativos durante horas.
No cálculo de tarefas, a terminação automática ocorre após a conclusão da tarefa. O cluster inicia-se automaticamente quando a próxima execução agendada começa, por isso não precisa de gerir o arranque manualmente.
Instâncias spot reduzem custos, mas apresentam compromissos de disponibilidade. O Azure pode recuperar instâncias pontuais quando a capacidade for necessária noutros locais. Para nodos de trabalho, as instâncias spot funcionam bem porque o Azure Databricks/Spark consegue lidar com falhas dos nodos de trabalho. No entanto, deve sempre usar instâncias sob demanda para os nós do driver. Se o driver for recuperado, isso faz com que todo o cluster falhe.
Ative o descomissionamento ao usar instâncias pontuais para reduzir falhas de tarefa. Quando uma instância spot recebe uma notificação de preempção, o processo de desativação migra os dados de shuffle e cache para trabalhadores funcionais antes da instância terminar. Isto reduz a necessidade de recalcular dados perdidos.
Utilizar conjuntos de instâncias
Os pools de instâncias mantêm um conjunto de instâncias inativas prontas para uso imediato, reduzindo o tempo de arranque do cluster de minutos para segundos.
Configure as instâncias mínimas ociosas para corresponder às suas necessidades típicas de processamento concorrente em clusters. Se executa regularmente três cadernos em simultâneo, mantenha pelo menos três instâncias de inatividade. Estas instâncias permanecem disponíveis mesmo quando não estão em uso, proporcionando o arranque instantâneo do cluster.
Defina a capacidade máxima para controlar custos e evitar que uma única carga de trabalho consuma todos os recursos disponíveis. Quando várias equipas partilham um espaço de trabalho, pools com definições de capacidade máxima garantem uma distribuição justa dos recursos. Por exemplo, com uma quota de 100 instâncias, podes criar dois pools cada um com um máximo de 50 instâncias para duas equipas.
A definição de terminação automática de instâncias de inatividade remove instâncias que excedam o seu número mínimo de inatividade após o período especificado. Se definir o mínimo de inatividade para 3 e a terminação automática para 30 minutos, um pool que escala até 8 instâncias vai reduzir para 3 instâncias após 30 minutos de inatividade.
O pré-carregamento de uma versão do Databricks Runtime nas instâncias do pool acelera ainda mais o lançamento de clusters. Ao criar um cluster, se selecionar o tempo de execução pré-carregado, o cluster começa quase imediatamente porque o tempo de execução já está instalado em instâncias ociosas.
Os pools funcionam melhor para cargas de trabalho com ciclos frequentes de criação e terminação de clusters. As equipas de desenvolvimento que criam e destroem aglomerados ao longo do dia registam poupanças significativas de tempo. Trabalhos de produção que correm em clusters dedicados e de longa duração não beneficiam tanto dos pools.
Equilíbrio entre custo e desempenho
Alcançar o equilíbrio certo entre custo e desempenho requer compreender as características da sua carga de trabalho e ajustar as configurações em conformidade.
Comece com definições conservadoras e monitorize o desempenho. Se vir transbordo frequente para o disco ou execução lenta de consultas, aumente a quantidade de memória ou de núcleos. Se a utilização se mantiver baixa, reduza o tamanho do cluster ou permita o autoescalonamento.
Observação
Use a interface do Spark para identificar problemas de desempenho. Consulte a Linha do Tempo de Trabalhos para encontrar etapas de longa duração e veja a página de detalhes da etapa para estatísticas de spill que mostram Shuffle Spill (Memória) e Shuffle Spill (Disco). Compare as durações das fases para identificar gargalos e consultas lentas.
Utilize computação serverless quando a sua carga de trabalho o permite. O serverless elimina decisões de configuração e escala automaticamente com base na procura, proporcionando frequentemente o melhor equilíbrio custo-desempenho sem necessidade de ajustes manuais.
A monitorização regular ajuda-o a identificar oportunidades de otimização. Analise as métricas de clusters para ver a utilização real comparada com a capacidade provisionada. Ajuste os tipos de nós, o número de trabalhadores ou as definições de escalabilidade com base em padrões observados em vez de suposições.
Observação
Monitorização e observabilidade são abordadas em detalhe num módulo posterior.