Otimização do uso de memória para Apache Spark
Este artigo discute como otimizar o gerenciamento de memória do Apache Spark para obter um melhor desempenho no Azure HDInsight.
Visão geral
O Spark opera colocando dados na memória. Portanto, o gerenciamento de recursos de memória é um aspecto fundamental da otimização na execução de trabalhos do Spark. Há várias técnicas que podem ser aplicadas para usar a memória do cluster de maneira eficiente.
- Preferir partições de dados menores e considerar o tamanho, os tipos e a distribuição de dados na sua estratégia de particionamento.
- Considere
Kryo data serialization
mais recentes e eficientes em vez da serialização de Java padrão. - Preferir utilizar o YARN, pois separa
spark-submit
em lotes. - Monitorar e sintonizar as definições da configuração do Spark.
Para sua referência, a estrutura da memória do Spark e alguns parâmetros da memória do executor chave são mostrados na próxima imagem.
Considerações de memória do Spark
Se estiver usando o YARN do Apache Hadoop, o YARN controlará a memória usada por todos os contêineres em cada nó do Spark. O diagrama a seguir mostra os objetos de chave e os respectivos relacionamentos.
Para endereçar mensagens de "memória insuficiente", tente:
- Revisar as ordens aleatórias de armazenamento do DAG. Reduzir a redução do lado do mapa, os dados de origem de pré-partição (ou fazer bucket), maximizar as ordens aleatórias simples e reduzir a quantidade de dados enviados.
- Preferir
ReduceByKey
com o limite de memória fixa paraGroupByKey
, que fornece agregações, janelas e outras funções, mas tem limite de memória ilimitado. - Preferir
TreeReduce
, que faz mais trabalho nos executores ou partições, paraReduce
, que faz todo o trabalho no driver. - Usar os Conjuntos de Dados em vez dos objetos RDD de nível inferior.
- Criar ComplexTypes que encapsulam ações, como "Top N", várias agregações ou operações de janelas.
Para obter etapas de solução de problemas adicionais, consulte exceções OutOfMemoryError para Apache Spark no Azure HDInsight.