Técnicas de otimização para uma plataforma de computação distribuída em memória, aproveitando SSD Parte 1

Aug 17, 2023

Abstrato:

Neste artigo, apresentamos diversas estratégias de otimização que podem melhorar o desempenho geral do sistema de computação distribuído em memória, "Apache Spark". Apesar de sua capacidade de gerenciamento de memória distribuída para trabalhos iterativos e dados intermediários, o Spark apresenta um problema significativo de degradação de desempenho quando a quantidade disponível de memória principal (DRAM, normalmente usada para armazenamento em cache de dados) é limitada.

Para resolver esse problema, utilizamos um SSD (unidade de estado sólido) para complementar a falta de largura de banda da memória principal. Especificamente, apresentamos uma metodologia de otimização eficaz para Apache Spark, investigando coletivamente os efeitos da alteração das taxas de fração de capacidade do embaralhamento e dos espaços de armazenamento na "configuração de heap JVM do Spark" e aplicando diferentes "políticas de cache RDD" (por exemplo, SSD cache de memória).

A estratégia de cache RDD refere-se ao método de cache RDD no Spark para melhorar o desempenho do programa. Através do cache, os resultados dos cálculos podem ser armazenados na memória para evitar cálculos repetidos, melhorando assim a velocidade de operação do programa. A memória refere-se à capacidade cognitiva dos seres humanos e também é uma parte importante da inteligência humana.

Embora o cache e a memória RDD não pareçam ter nenhum relacionamento, eles têm uma certa conexão. Em primeiro lugar, o cache pode nos ajudar a lembrar rapidamente os resultados dos cálculos, de modo que a capacidade de memória dos resultados dos cálculos pode ser melhorada por meio do cache. Quando precisamos reutilizar o mesmo resultado do cálculo, o cache pode nos ajudar a lembrar o resultado rapidamente e evitar recálculos todas as vezes.

Além disso, através da estratégia de cache RDD, podemos armazenar os resultados dos cálculos na memória, evitando assim leituras e gravações frequentes no disco, economizando muito tempo e recursos. Isso também pode ser considerado uma espécie de “memória”, armazenando os resultados dos cálculos na memória para que possamos utilizá-los a qualquer momento.

Resumindo, existe de fato uma certa relação entre a estratégia de cache RDD e a memória. Através do cache, podemos melhorar a capacidade de memória dos resultados dos cálculos e também armazenar os resultados dos cálculos na memória, economizando tempo e recursos e melhorando o desempenho do programa. Essa estratégia positiva pode nos ajudar a fazer melhor uso dos recursos computacionais, melhorar a eficiência do trabalho e alcançar mais objetivos.

Percebe-se que precisamos melhorar nossa memória. Cistanche pode melhorar significativamente a memória, porque Cistanche também pode regular o equilíbrio dos neurotransmissores, como aumentar o nível de acetilcolina e fatores de crescimento. Essas substâncias são muito importantes para a memória e o aprendizado. Além disso, a carne também pode melhorar o fluxo sanguíneo e promover o fornecimento de oxigênio, o que pode garantir que o cérebro receba nutrição e energia suficientes, melhorando assim a vitalidade e a resistência do cérebro.

improve working memory

Clique em conhecer suplementos para melhorar a memória

Nossos extensos resultados experimentais mostram que, utilizando as técnicas de otimização propostas, podemos melhorar o desempenho geral em até 42%.

Palavras-chave:

Apache Faísca; gerenciamento de memória; Disco de Estado Sólido; estrutura de processamento na memória; desempenho; Ranking da página; fechamento transitivo; TeraSort; k-significa agrupamento; Configuração de heap da Java Virtual Machine; conjunto de dados distribuído resiliente.

1. Introdução

À medida que a indústria de big data se desenvolve rapidamente, tem havido vários esforços de pesquisa para construir estruturas de processamento distribuído, como MapReduce [1] do Hadoop [2], que possam armazenar e processar efetivamente "Big Data".

No entanto, o desempenho do Hadoop baseado em discos de eixo normal (HDD) pode ser degradado devido às operações de leitura/gravação do sistema de arquivos distribuídos Hadoop (HDFS) [3], especialmente para cargas de trabalho de aprendizado de máquina onde pode haver muitos trabalhos iterativos e dados intermediários. Para resolver esse problema, foi introduzida a estrutura Spark [4], que pode efetivamente armazenar em cache os dados intermediários na memória, para que a plataforma de computação em cluster possa melhorar drasticamente o desempenho geral.

No entanto, de acordo com um estudo abrangente que analisa o comportamento de desempenho do Spark [5], o Spark ainda pode ter problemas de degradação de desempenho devido a algumas tarefas retardadas. Como resultado da análise das tarefas que afetam todo o tempo de conclusão do trabalho do Spark, a coleta de lixo, a gravação aleatória e a leitura aleatória são identificadas como os principais fatores que podem afetar negativamente o desempenho do sistema Spark.

Infelizmente, uma análise detalhada das principais razões pelas quais essas tarefas mencionadas afetam o processamento de tarefas no Spark e possíveis soluções ainda não foram minuciosamente investigadas.

Neste artigo, primeiro analisamos os fatores específicos que podem explicar por que a coleta de lixo, a gravação aleatória e a leitura aleatória afetam o processamento de tarefas no Spark e apresentamos situações associadas e possíveis soluções por meio de extensos experimentos em um cluster Spark.

Especificamente, para analisar os fatores que causam a degradação do "tempo de conclusão de todo o trabalho" do Spark, realizamos vários experimentos com PageRank [6], fechamento transitivo [7], TeraSort [8] e agrupamento k-means [9] cargas de trabalho. Com base em nossos extensos resultados experimentais, encontramos potenciais fatores de degradação de desempenho no sistema Spark que podem ser resumidos da seguinte forma:

1. A degradação do desempenho na coleta de lixo Java: Como o Spark está sendo executado em Java Virtual Machines (JVM), a coleta de lixo Java pode ocorrer especialmente quando há falta de memória do executor do Spark, ou seja, tamanho de heap da JVM.

2. A degradação do desempenho no derramamento de embaralhamento: Quando a gravação embaralhada estiver sendo processada, se a memória embaralhada da memória do executor do Spark (heap JVM) for insuficiente, o Spark espalhará os dados embaralhados para o disco (HDD). Nesse caso, o Spark precisa serializar os dados para gravar e desserializar para ler os dados do disco. Como é necessário um recurso de CPU para os processos de serialização e desserialização, isso pode retardar o processamento geral das tarefas.

3. A degradação do desempenho no tempo de bloqueio de leitura aleatória: como veremos nos resultados experimentais, se o número de tarefas continuar aumentando em estágios iterativos, como na carga de trabalho de fechamento transitivo, pode haver sobrecarga de agendamento e coletas de lixo Java devido à falta de Memória do executor Spark. Isso pode fazer com que as tarefas de leitura aleatória sejam bloqueadas, o que pode resultar em baixo desempenho.

A principal contribuição deste artigo é propor estratégias eficazes de configuração de cluster Spark que podem melhorar o desempenho geral do sistema utilizando SSDs para superar os limites de memória física do cluster. Em um ambiente típico de computação em cluster que consiste em servidores comuns, seria difícil configurar uma grande quantidade de memória principal.

Portanto, abordamos os problemas de degradação de desempenho em um sistema de computação distribuído na memória que podem ocorrer devido a quantidades insuficientes de memória principal, aproveitando efetivamente os SSDs. Nossa estratégia de otimização é dupla, como segue.

Primeiro, alteramos as taxas de fração de capacidade do embaralhamento e dos espaços de armazenamento na "Configuração de heap JVM do Spark". De acordo com os resultados experimentais de diferentes cargas de trabalho, observamos diferenças de desempenho dependendo dos padrões de uso de memória da carga de trabalho.

Em segundo lugar, aplicamos diferentes "Políticas de cache RDD", como sem cache, cache somente de memória, cache somente de disco e cache de memória apoiado por SSD. Na maioria dos casos, a política de cache de memória apoiada por SSD mostra o melhor desempenho, a menos que todos os RDDs caibam completamente na memória principal real.

Conduzimos uma avaliação empírica de desempenho sob diversas configurações e diferentes cargas de trabalho. Nossos resultados experimentais mostram que, ao alocar cuidadosamente as quantidades de armazenamento e áreas aleatórias no heap JVM do Spark com base no uso de memória das cargas de trabalho de destino e ao aplicar uma política de cache RDD ideal, podemos reduzir substancialmente o tempo total de execução em até 42%.

O restante deste artigo está estruturado da seguinte forma. Na Seção 2, descrevemos brevemente o histórico do sistema Spark e apresentamos trabalhos relacionados, e a Seção 3 apresenta o uso do Spark e a configuração do cluster Spark e detalha nossa metodologia de otimização para melhorar o desempenho geral. Na Seção 4 apresentamos nossos resultados experimentais e análises dos fatores de degradação de desempenho e soluções associadas para eles. A Secção 5 discute os resultados da avaliação e resume as nossas conclusões, e concluímos e discutimos trabalhos futuros na Secção 6.

2. Antecedentes e Trabalhos de Pesquisa Relacionados
2.1. Fundo

Apache Hadoop tem sido a plataforma padrão de fato de armazenamento e processamento de "big data", distribuindo e gerenciando com eficácia os dados e cálculos em muitos nós. No entanto, o Hadoop não consegue alcançar desempenho competitivo para algumas aplicações como aprendizado de máquina, especialmente aquelas que consistem em vários estágios iterativos e uma quantidade relativamente grande de dados intermediários. Isso ocorre porque, em cada estágio iterativo, o Hadoop precisa ler e gravar dados de/para um HDFS gerado pelo MapReduce.

O Apache Spark explora conjuntos de dados distribuídos resilientes (RDD) [10] que podem gerenciar com eficácia quaisquer dados intermediários/finais na memória principal, como cache, que podem ser utilizados com eficiência em cada estágio de aplicativos iterativos. Como o RDD é imutável, o Spark introduz um conceito de linhagem que pode acompanhar o histórico de criações do RDD, que pode ser usado para recuperação de falhas.

Através deste conceito, o Spark pode reduzir o número de operações de E/S no disco em comparação com o Hadoop. Devido a essa capacidade de computação distribuída na memória, o Spark normalmente apresenta melhor desempenho do que o Hadoop para uma ampla variedade de aplicativos de análise de dados.

No entanto, a RAM usada na memória principal para armazenar os dados do Spark é relativamente cara em termos de preço unitário por byte, portanto, seria muito difícil construir uma quantidade grande o suficiente de RAM no cluster Spark para suportar várias cargas de trabalho.

ways to improve your memory

Portanto, a capacidade limitada da RAM pode restringir a velocidade geral do processamento do Spark. Se o Spark não puder armazenar em cache o RDD na RAM devido ao espaço limitado durante o processamento do aplicativo, o Spark terá que gerar novamente os RDDs ausentes que não cabem na RAM em todos os estágios, tornando-se semelhante à abordagem do Hadoop. Além disso, como o trabalho Spark é um processo Java em execução na JVM, a GC (coleta de lixo) ocorre sempre que a quantidade de memória disponível é limitada. Como o RDD normalmente é armazenado em cache no espaço antigo da JVM, quando ocorre um GC importante, ele pode afetar substancialmente o desempenho de processamento de todo o trabalho.

Além disso, a falta de memória pode causar um “Shuffle Spill”, que é o processo de derramamento dos dados intermediários gerados durante o embaralhamento da memória para o disco. O derramamento de embaralhamento envolve muitas operações de E/S de disco e sobrecargas de CPU. Consequentemente, uma nova solução deve ser considerada para armazenar em cache todos os RDDs e proteger a memória para o embaralhamento.

2.2. Trabalho relatado

Houve muitos estudos relacionados na literatura sobre melhorias de desempenho da plataforma Spark, como segue. A Tabela 1 resume os trabalhos relacionados de acordo com os assuntos.

improve cognitive function

• Melhorando o desempenho do Spark Shuffle:

A otimização do desempenho do shuffle no Spark [11] analisa o gargalo na execução de um trabalho do Spark e apresenta duas alternativas, compactação colunar e consolidação de arquivo shuffle. Como o vazamento de todos os dados do buffer da memória é um fardo para o sistema operacional, a solução é gravar menos arquivos maiores em primeiro lugar.

Nicolae et al. apresentou um novo método de E/S adaptativo para embaralhamento coletivo de dados [12]. Eles adaptam o acúmulo de blocos aleatórios à taxa individual de processamento para cada tarefa do redutor, enquanto coordenam os redutores para colaborar na seleção ideal das fontes (ou seja, de onde buscar os blocos aleatórios). Dessa forma, eles equilibram bem as cargas e evitam atrasos, reduzindo o uso de memória do buffer.

Riffle [13] é um dos serviços de shuffle mais eficientes para análise de dados em grande escala. O Riffle mescla arquivos aleatórios fragmentados em arquivos de blocos maiores e, assim, converte solicitações de E/S de disco pequenas e aleatórias em solicitações grandes e sequenciais. O Riffle também mistura arquivos de bloco mesclados e não mesclados para minimizar a sobrecarga da operação de mesclagem. Pu et al. sugerem um serviço de shuffle econômico, combinando armazenamento barato, mas lento, com armazenamento rápido, mas caro, para obter um bom desempenho [14]. Eles executam TPC-DS, CloudSort e Big Data Benchmark em seus sistemas e mostram uma redução no uso de recursos em até 59%.

Todos eles enfatizam a melhoria do desempenho do embaralhamento e da economia, coordenando a transferência de rede ou reduzindo a E/S do disco. No entanto, em nosso estudo, configuramos o heap JVM para reduzir o derramamento de embaralhamento, que é um gargalo na fase de embaralhamento e no tempo de conclusão do trabalho.

• Análise de desempenho, modelagem e otimização para Spark:

Os autores de [15] mostram que a E/S de armazenamento desempenha um papel importante nas estruturas de computação em cluster na memória e propõem um modelo analítico com reconhecimento de E/S para raciocinar através do desempenho de programas Spark. O modelo proposto pode explicar e prever analiticamente o comportamento em tempo de execução de algoritmos iterativos que são algoritmos pesados ​​de computação/embaralhamento. Eles também aplicam o modelo proposto de otimização de custos no Google Cloud.

Marcu et al. mostram a análise de desempenho de Spark e Flink com base em seus resultados experimentais comparativamente usando cargas de trabalho representativas [16]. Eles identificam um conjunto dos quatro parâmetros mais importantes que têm grande influência no desempenho. O paralelismo da tarefa, o comportamento da rede durante a fase de embaralhamento, a memória e a serialização dos dados são os parâmetros mais importantes escolhidos. Por outro lado, em nosso estudo, nos concentramos na metodologia de melhoria de desempenho, escolhendo adequadamente o tipo de armazenamento e alocando a quantidade de armazenamento e áreas embaralhadas no heap JVM do Spark de acordo com os padrões de uso de memória das cargas de trabalho alvo.

• Ajuste de parâmetros para Spark:

Houve alguns testes de pesquisa para melhorar o desempenho do Spark ajustando todos os parâmetros de configuração. Petridis et al. mostram sua experiência de ajuste de parâmetros do Spark por tentativa e erro [17]. Eles escolhem 12 parâmetros principais específicos da instância do aplicativo e avaliam seu impacto usando execuções reais em um supercomputador Petaflop.

Da mesma forma, Gounaris e Torres [18] analisam o impacto dos parâmetros ajustáveis ​​mais importantes do Spark relativos ao embaralhamento, compressão e serialização no desempenho da aplicação de maneira empírica. Eles fornecem extensos resultados experimentais na infraestrutura de computação Marenostrum III (MN3) habilitada para Spark do Centro de Supercomputação de Barcelona.

Em contraste com o método de ajuste empírico, Yu et al. sugerem um esquema de autoajuste para uma plataforma de computação em memória [19]. Eles consideram o tamanho do conjunto de dados de entrada e 41 métricas de configuração como parâmetros do modelo de desempenho. Eles usam modelagem hierárquica (HM) para combinar vários submodelos individuais hierarquicamente e usam o algoritmo genético (GA) para procurar a configuração ideal. Embora os trabalhos de pesquisa acima tentem alcançar o desempenho ideal ajustando os parâmetros do Spark, o que é semelhante ao nosso trabalho, nosso artigo é diferente destes porque usamos uma política de cache de memória apoiada por SSD para estender efetivamente a limitação de memória física de um Spark. conjunto.

improve brain

• Otimização de memória para processamento de dados baseado em MapReduce:

Os autores de [20] analisam em profundidade o impacto da eficiência da memória no desempenho do framework Flame-MR compatível com Hadoop. Eles apresentam diversas técnicas de otimização de memória para reduzir o número de alocações e desalocações de objetos, diminuindo os overheads de GC e o tempo geral de execução. Em nosso estudo, aproveitamos os SSDs para melhorar o desempenho do sistema in-memory.

• Reduzindo a sobrecarga de JVM e coleta de lixo no Spark:

JVM e GC constituem uma das principais sobrecargas na plataforma Spark, especialmente quando a carga de trabalho sofre limitações de memória. Leão et al. apontam que a sobrecarga de aquecimento da JVM é um dos principais gargalos nas plataformas HDFS, Hive e Spark [21]. Eles propõem uma nova JVM que amortiza a sobrecarga de aquecimento reutilizando um conjunto de JVMs já aquecidas.

Maas et al. descobrem que as pausas induzidas por GC podem ter um impacto significativo no Spark [22]. Assim, eles propõem um sistema de tempo de execução holístico, um tempo de execução de linguagem distribuída que gerencia coletivamente os serviços de tempo de execução para coordenar pausas induzidas por GC em vários nós.

Embora ambos os artigos tratem de questões relacionadas a JVM e GC no Spark para casos gerais, nosso artigo pressupõe que as cargas de trabalho sofrem de limitações de memória.

• Otimização da política de gerenciamento de cache para Spark:

Os autores de [23] propõem contagem de referência de composição mínima (LCRC), uma política de gerenciamento de cache com reconhecimento de dependência que considera a dependência intra-estágio e entre estágios. O LCRC pode reescrever esses blocos acessados ​​entre estágios na memória antes de seu próximo uso. Em nosso estudo, aproveitamos os SSDs em vez de aprimorar a política de cache para melhorar o desempenho do sistema na memória.

improve memory

3. Técnicas de otimização para a plataforma Spark

Nesta seção, apresentamos nosso ambiente de cluster e técnicas de otimização associadas que podem melhorar o desempenho geral da plataforma Spark.


For more information:195477648nn@gmail.com

Você pode gostar também