Apache Spark Optimisation Techniques and Performance Tuning

By Chandan Gaur|Big Data Engineering / 05,Oct, 2020

What is Apache Spark?

Apache, in 2012, described the Resilient Distributed Dataset (RDD in Apache Spark) foundation with read-only Distributed datasets on distributed clusters and named it as Apache Spark. Mais tarde, eles introduzem API Dataset e, em seguida, APIs Dataframe para o lote e streaming estruturado de dados. Este artigo lista as melhores técnicas de otimização Apache Spark.Apache Spark é uma plataforma de computação de aglomerado rápido desenvolvida para realizar mais computações e processamento de fluxo. Spark pode lidar com uma grande variedade de cargas de trabalho, em comparação com os sistemas tradicionais que exigem vários sistemas para executar e suportar. Os gasodutos de análise de dados são facilitados pela faísca em combinação de diferentes tipos de processamento necessários para a produção. Apache Spark é criada para operar com um gerenciador de clusters externo, como o fio ou seu Gerenciador autônomo.

características da faísca Apache

algumas características da faísca Apache incluem:-

  • plataforma unificada para escrever grandes aplicações de dados.
  • facilidade de desenvolvimento.
  • concebidos para serem altamente acessíveis.
  • Spark can run independently. Assim, dá flexibilidade.
  • Custo-Eficácia.

XenonStack fornece serviços de análise e soluções para a ingestão, processamento e análise dos fluxos de dados em tempo Real e em tempo real para a Internet das coisas, monitoramento, manutenção preventiva e preditiva.

do artigo, Streaming and Real-Time Analytics Services

Understanding How Apache Spark Optimization Works?

para entender como funciona a Apache Spark optimization, você precisa entender sua arquitetura primeiro e na seção seguinte, nós elaboraremos o mesmo.

the architecture of Apache Spark

The Run-time architecture of Spark consists of three parts-

Spark Driver (Master Process)

The Spark Driver converts the programs into tasks and schedule the tasks for Executors. O escalonador de Tarefas é a parte do Driver e ajuda a distribuir tarefas para executores.

Spark Cluster Manager

Um cluster manager é o núcleo da Spark que permite lançar executores e, por vezes, os drivers também podem ser lançados por ela. Spark Scheduler agenda as ações e empregos na aplicação Spark em FIFO way no próprio gerenciador de cluster. Você também deve ler sobre Apache Airflow.Os executores (processos de trabalho escravo) são as entidades individuais em que funciona a tarefa individual de trabalho. Executores sempre funcionarão até o ciclo de vida de uma aplicação spark uma vez que eles são lançados. Os executores falhados não param a execução do spark job.

RDD (Conjuntos de dados distribuídos resilientes)

um RDD é uma coleção distribuída de conjuntos de dados imutáveis em nós distribuídos do conjunto. Um RDD é dividido em uma ou muitas partições. RDD é o núcleo da faísca como sua distribuição entre vários nós do aglomerado que alavancam a localidade de dados. Para alcançar o paralelismo dentro da aplicação, as partições são as unidades para ela. As transformações de repartição ou coalesce podem ajudar a manter o número de partições. O acesso aos dados é otimizado utilizando o baralhamento de RDD. Como Spark está perto de dados, ele envia dados através de vários nós através dele e cria partições necessárias, conforme necessário.

DAG (gráfico acíclico direcionado)

Spark tende a gerar um grafo de operador quando entramos no nosso código para Spark console. Quando uma ação é desencadeada para Spark RDD, Spark submete esse grafo para o DAGScheduler. Em seguida, divide esses gráficos de operador para estágios da tarefa dentro DAGScheduler. Cada passo pode conter tarefas com base em várias partições dos dados recebidos. O DAGScheduler canaliza esses gráficos individuais do operador juntos. Por exemplo, o cronograma de gráficos de operador de mapa para um único estágio e essas etapas passam para o. Escalonador de tarefas no Gestor de clusters para a sua execução. Esta é a tarefa de trabalho ou executores para executar essas tarefas no escravo.

o processamento distribuído utilizando partições eficientemente

O aumento do número de executores em clusters também aumenta o paralelismo no processamento de postos de trabalho por faísca. Mas para isso, é preciso ter informações adequadas sobre como esses dados seriam distribuídos entre esses executores por meio de particionamento. O RDD é útil para este caso, com tráfego negligenciável para dados que se desloquem entre esses executores. Pode-se personalizar o particionamento para par RDD (RDD com pares chave-valor). Spark assegura que o conjunto de chaves aparecerá sempre junto no mesmo nó porque não há controle explícito neste caso.Apache Spark security aids authentication through a shared secret. A autenticação Spark é o parâmetro de configuração através do qual a autenticação pode ser configurada. É o parâmetro que verifica se os protocolos da comunicação spark estão fazendo autenticação usando um segredo compartilhado ou não.

a Partir do Artigo, o Apache Faísca de Segurança

para evitar Erros ao escrever Faísca Aplicações

reduceByKey ou groupByKey

Ambos groupByKey e reduceByKey produzir a mesma resposta, mas o conceito de produzir resultados são diferentes. reduceByKey é melhor adequado para grandes conjuntos de dados porque no Spark ele combina saída com uma chave compartilhada para cada partição antes de baralhar os dados. Enquanto do outro lado, groupByKey baralha todos os pares de valores-chave. GroupByKey causa baralhos desnecessários e transferência de dados sobre a rede.

manter o tamanho necessário dos blocos de baralhar

por padrão, bloco de baralhar de faísca não pode exceder 2GB. O melhor uso é aumentar as partições e reduzir a sua capacidade para ~128MB por partição que irá reduzir o tamanho do bloco shuffle. Nós podemos usar repartition ou coalesce em aplicações regulares. Partições grandes tornam o processo lento devido a um limite de 2GB, e poucas partições não permitem escalar o trabalho e alcançar o paralelismo.

formatos de ficheiro e delimitadores

escolher os formatos de ficheiro certos para cada especificação relacionada com dados é uma dor de cabeça. Deve – se escolher sabiamente o formato de dados para tipos de ingestão, tipo intermediário e tipo de saída Final. Também podemos classificar os formatos de arquivos de dados para cada tipo de várias maneiras, como podemos usar o formato de arquivo AVRO para armazenar dados de mídia como Avro é melhor otimizado para dados binários do que Parquet. Parquet pode ser usado para armazenar informações de metadados como ele é altamente comprimido.

pequenos arquivos de dados

radiodifusão é uma técnica para carregar pequenos arquivos de dados ou conjuntos de dados em blocos de memória para que eles possam ser unidos com conjuntos de dados mais maciços com menos sobrecarga de dados baralhados. Por exemplo, nós podemos armazenar pequenos arquivos de dados em n Número de blocos e grandes arquivos de dados podem ser unidos a estes blocos de dados no futuro como grandes arquivos de dados podem ser distribuídos entre estes blocos de uma forma paralela.

nenhuma monitorização das fases de trabalho

DAG é uma estrutura de dados usada na faísca que descreve várias fases de tarefas em formato gráfico. A maioria dos desenvolvedores escreve e executa o código, mas monitorar tarefas de trabalho é essencial. Este acompanhamento é melhor alcançado através da Gestão da DAG e da redução das etapas. O trabalho com 20 passos é prolongado em comparação com um trabalho com 3-4 estágios.ByKey, repartition ou quaisquer outras operações que desencadeiam shuffles

na maioria das vezes precisamos evitar shuffles tanto quanto podemos como os dados shuffles através de muitos, e às vezes torna-se muito complexo para obter escalabilidade para fora dessas shuffles. GroupByKey pode ser um ativo valioso, mas sua necessidade deve ser descrita em primeiro lugar.

aprendizagem de reforço

aprendizagem de reforço não é apenas o conceito para obter um melhor ambiente de aprendizagem de máquina, mas também para processar as decisões de uma forma melhor. Deve-se aplicar a aprendizagem de reforço profundo na faísca se o modelo de transição e modelo de recompensa são construídos corretamente em conjuntos de dados e também agentes são capazes o suficiente para estimar os resultados.Apache Spark Optimization Factors and Techniques

One of the best features of Apache Spark optimization is it helps for In-memory data computations. O gargalo para estes cálculos de otimização de faíscas pode ser CPU, memória ou qualquer recurso no cluster. A necessidade de serializar os dados, reduzir a memória pode surgir em tais casos. Estes fatores para a faísca de otimização, se usados correctamente, podem–

  • Eliminar o longo processo de trabalho
  • Correção do motor de execução
  • Melhora o desempenho do tempo, gestão de recursos

13 Técnicas Simples para o Apache Faísca de Otimização

Acumuladores são variáveis globais para os executores, que só podem ser adicionadas através de um associativa e comutativa da operação. Pode, portanto, ser eficiente em paralelo. Acumuladores podem ser usados para implementar contadores (como no Map Reduce) ou outra tarefa como rastreamento de chamadas API.

por padrão, Spark suporta acumuladores numéricos, mas os programadores têm a vantagem de adicionar suporte para novos tipos. Spark garante que a atualização de cada tarefa só será aplicada uma vez às variáveis acumuladoras. Durante as transformações, os usuários devem ter uma consciência da atualização de cada tarefa, uma vez que estas podem ser aplicadas mais de uma vez se as fases de trabalho forem re-executadas.Resultados de Bucketing com um número fixo de Ficheiros à medida que especificamos o número de baldes com um balde. Colmeia pegou o campo, calculou o hash e atribuiu um registro para esse balde em particular. Bucketing é mais estável quando o campo tem alta cardinalidade, grande processamento de dados, e registros são distribuídos uniformemente entre todos os baldes, enquanto particionamento funciona quando a cardinalidade do campo de particionamento é baixa.

Bucketing reduz a sobrecarga dos ficheiros de triagem. Por exemplo, se estamos juntando duas tabelas que têm um número igual de baldes nele, spark junta os dados diretamente como chaves já ordenadas baldes. O número de arquivos de balde pode ser calculado como várias partições em vários baldes.

predicate Pushdown Optimization

Predicate pushdown is a technique to process only the required data. Predicados podem ser aplicados ao SparkSQL definindo filtros em condições onde. Usando o comando explain para consultar, podemos verificar as fases de processamento da consulta. Se o plano de consulta contém filtro PushedFilter do que a consulta é otimizada para selecionar apenas os dados necessários como cada predicado retorna verdadeiro ou Falso.

Se não houver Filtro PushedFilter encontrado no plano de consulta melhor é lançar a condição de onde. Predicate Pushdowns limita o número de arquivos e partições que o SparkSQL lê enquanto questiona, reduzindo assim o disco I/O inicia na análise de memória. Questionar dados em baldes com avarias de predicados produz resultados mais rápidos com menos baralhadas.

Zero Data Serialization/Deserialization using Apache Arrow

Apache Arrow is used as an In-Memory run-time format for analytical query engines. Arrow Provê serialização de dados / deserialização zero shuffles através da memória compartilhada. O Arrow flight envia os grandes conjuntos de dados sobre a rede. O Arrow tem o seu formato de ficheiro arrow que permite o acesso aleatório de cópia zero aos dados em discos. Arrow tem uma camada de acesso de dados padrão para todas as aplicações spark.

reduz a sobrecarga das operações SerDe para baralhar dados, uma vez que tem um lugar comum onde todos os dados residem e em formato específico de seta.

afinação de recolha de lixo usando a recolha G1GC

Quando ajustamos colectores de lixo, recomendamos pela primeira vez o uso de G1 GC para executar aplicações de faísca. O coletor de lixo G1 lida inteiramente com cabeçalhos de crescimento que são comumente vistos com faísca. Com o G1, serão necessárias menos opções para proporcionar tanto maior rendimento como menor latência. Para controlar características imprevisíveis e comportamentos de várias aplicações, o ajuste GC precisa ser dominado de acordo com os logs gerados.

antes disso, outras técnicas de otimização como Streaming e soluções de análise em tempo Real, na lógica e Código do programa devem ser aplicadas. Na maioria das vezes, o G1GC ajuda a otimizar o tempo de pausa entre processos que são muitas vezes em aplicações Spark, diminuindo assim o tempo de execução do trabalho com um sistema mais confiável.

Gerenciamento de Memória e Ajuste de

Como sabemos que, para computações, tais como o descarte, a classificação e assim por diante, a Execução de memória é utilizado, enquanto que para fins de cache de memória de armazenamento é usado que também se propaga de dados interno. Pode haver alguns casos em que jobs não estão usando nenhum cache; portanto, casos fora do espaço erro durante a execução. As tarefas em cache aplicam sempre menos espaço de armazenamento onde os dados não podem ser despejados por qualquer exigência de execução. Além disso, aplicação de Streaming em tempo Real com Apache Spark pode ser feito.Podemos fazer faísca.memoria.fraction to determine how much JVM heap space is used for Spark execution memory. Normalmente, 60% é o padrão. A memória executora deve ser mantida o menos possível, pois pode levar ao atraso da coleta de lixo da JVM. Este fato também é aplicável para pequenos executores, uma vez que múltiplas tarefas podem ser executadas em uma única instância da JVM.

Data Locality

In Apache Spark, Processing tasks are optimized by placing the execution code close to the processed data, called data locality. Às vezes a tarefa de processamento tem que esperar antes de obter dados, porque os dados não estão disponíveis. No entanto, quando o tempo da faísca.localidade.espera expira, Spark tenta menos nível local, ou seja, Local para o nó para rack para qualquer.

transferir dados entre discos é muito caro, por isso a maioria das operações deve ser realizada no local onde os dados residem. Ele ajuda a carregar apenas pequenos, mas exigiu a quantidade de dados, juntamente com o desenvolvimento de test-driven para o Apache Spark.

Using Collocated Joins

Collocated joins make decisions of redistribution and broadcasting. Podemos definir pequenos conjuntos de dados para serem localizados em vários blocos de memória para alcançar um melhor uso da transmissão. Enquanto aplica junções em dois conjuntos de dados, spark primeiro ordena os dados de ambos os conjuntos de dados por chave e eles se fundem.

mas, também podemos aplicar a chave de ordenação de partição antes de juntá-los ou ao criar esses quadros de dados da arquitetura de seta Emapache. Isso irá otimizar o tempo de execução da consulta como não haveria chamadas de funções desnecessárias para classificar.Caching in Spark

Caching in Apache Spark with GPU is the best technique for Apache Spark Optimization when we need some data again and again. Mas é sempre inaceitável cache de dados.

temos que usar cache () RDD e DataFrames em qualquer dos seguintes casos–

  • quando há um loop iterativo, como em algoritmos de aprendizagem de máquinas.
  • quando RDD é acessado várias vezes em um único trabalho ou tarefa.
  • quando o custo para gerar as partições RDD novamente é maior.

Cache () e persistem (StorageLevel.MEMORY_ONLY) pode ser usado no lugar um do outro. Cada partição RDD que é despejada da memória é necessária para ser construída novamente a partir da fonte que ainda é muito caro. Uma das melhores soluções é usar persist (nível de armazenamento.MEMORY_AND_DISK_ONLY) que iria espalhar as partições de RDD para o disco local do Trabalhador. Este caso requer apenas obter dados a partir da unidade local do trabalhador que é relativamente rápido.

Tamanho Executor

quando executamos executores com memória elevada, muitas vezes resulta em atrasos excessivos na recolha do lixo. Precisamos manter a contagem de núcleos por executor abaixo de cinco tarefas por executor. Executores muito pequenos não se revelaram úteis em termos de executar vários trabalhos em uma única JVM.

por exemplo, variáveis de transmissão devem ser replicadas para cada executor exatamente uma vez, o que resultará em mais cópias dos dados.

função de janelas de faísca

uma função de janela define um quadro através do qual podemos calcular as linhas de entrada de uma tabela. Ao nível individual da fila. Cada linha pode ter um quadro claro. Windowing permite-nos definir uma janela para os dados na moldura de dados. Podemos comparar várias linhas na mesma moldura de dados.

podemos definir o tempo da janela para um determinado intervalo que irá resolver a questão da dependência de dados com dados anteriores. Shuffling in Apache Beam is less on previously processed data as we are retaining that data for window interval.

a técnica das marcas de água

a marca de água é uma técnica útil na otimização da centelha Apache que restringe o sistema por design e ajuda a evitar que ele expluda durante a execução. Marca d’água leva dois argumentos–

  • Coluna para a hora do evento e
  • Um limite de tempo que especificar por quanto tempo nós são necessários para o processo final de dados

A consulta no Apache Seta Arquitetura será automaticamente atualizado se o dado cair dentro do limite estipulado; caso contrário, nenhum de processamento é acionado para que o atraso de dados. É preciso lembrar que podemos usar o modo completo lado a lado com a marca de água, porque o modo completo primeiro persiste todos os dados para a tabela resultante.

Data Serialization

Apache Spark optimization works on data that we need to process for some use cases such as Analytics or just for movement of data. Este movimento de dados ou análises pode ser bem realizado se os dados estão em algum formato melhor serializado. Apache Spark suporta serialização de dados para gerenciar os formatos de dados necessários na fonte ou destino de forma eficaz. Por padrão, o Apache Spark usa serialização Java, mas também suporta a serialização Kryo.

por padrão, Spark usa o ObjectOutputStream de Java para serializar os dados. A implementação pode ser através do java.io.Classe serializável. Ele codifica os objetos em uma corrente de bytes. Ele fornece persistência leve e flexível. Mas torna-se lento, pois leva a enormes formatos serializados para cada classe em que é usado. Spark suporta Kryo Serialization library (v4) para serialização de objetos quase 10x mais rápido do que a serialização Java, pois é mais compacta do que Java.Apache Spark Optimization: A Comprehensive Approach

Apache Spark, an open-source distributed computing engine, is currently the most popular framework for in-memory batch processing, which also supports real-time streaming. Com seu avançado otimizador de consulta e motor de execução, as técnicas de otimização Apache Spark podem processar e analisar grandes conjuntos de dados de forma muito eficiente. No entanto, executar técnicas de otimização Apache Spark Join sem afinação cuidadosa pode degradar o desempenho. Se você quer aproveitar o seu poder de Aplicação Apache Spark, então confira nossos Serviços Gerenciados Apache Spark.

Categorias :

Big Data Development, Big Data Solutions, Streaming Data Analytics,

Share:

You might also like

Deixe uma resposta

O seu endereço de email não será publicado.