O PySpark pode ser um grande consumidor de recursos, principalmente quando você está trabalhando com grandes conjuntos de dados. Ajustar as configurações pode ajudar a otimizar o uso de memória e melhorar o desempenho.
Aqui estão alguns parâmetros e dicas que você pode considerar:
1- Configurações de Memória Executora: A memória executora é usada para armazenar os dados dos RDDs, broadcasts, acumuladores, etc. Ajuste essa configuração de acordo com suas necessidades através do parâmetro abaixo (que pode ser usado no Spark Submit ou definido no arquivo de configurações do Spark):
conf.set(“spark.executor.memory”, “4g”)
2- Configurações de Memória do Driver: Ajuste a quantidade de memória usada pelo processo do driver, que coordena os executores. Use o parâmetro abaixo:
conf.set(“spark.driver.memory”, “2g”)
3- Configuração de Memória de Armazenamento e Memória Shuffle: Você pode dividir a memória executora em duas regiões: a região de armazenamento que armazena os dados dos RDDs persistentes, e a região de shuffle que armazena os dados intermediários da computação com o parâmetro abaixo:
conf.set(“spark.memory.storageFraction”, “0.5”)
4- Memória Off-Heap: Isso permite o uso de memória fora do heap da JVM.
conf.set(“spark.memory.offHeap.enabled”, True)
conf.set(“spark.memory.offHeap.size”, “2g”)
5- Garbage Collection (GC) Tuning: O uso extensivo de GC pode afetar o desempenho. Você pode ajustar a JVM para usar o G1GC, que geralmente é mais eficiente.
conf.set(“spark.executor.extraJavaOptions”, “-XX:+UseG1GC”)
6- Reparticionar os Dados: Se você sabe que está trabalhando com um número menor de partições do que os executores disponíveis, pode reparticionar os dados de acordo. Menos partições podem economizar memória.
7- Persistência com Níveis de Armazenamento: Utilize persist() ou cache() com um nível de armazenamento apropriado, como MEMORY_AND_DISK para armazenar os RDDs nos quais você está realizando várias operações, para evitar o recomputing.
8- Broadcasting: Se você está realizando uma operação de join em uma tabela grande e uma tabela pequena, o broadcasting da tabela pequena pode tornar o join mais eficiente.
9- Desabilitar o Caching de Broadcast: Se você está enfrentando problemas de OOM (Out of Memory), considere desabilitar o caching de broadcast com o parâmetro abaixo:
conf.set(“spark.sql.autoBroadcastJoinThreshold”, “-1”)
10- Usar Tipos de Dados Adequados: Certifique-se de usar os tipos de dados adequados para suas colunas, o que pode economizar uma quantidade significativa de memória.
Bônus: Desabilitar o Log Detalhado: Os logs são importantes, mas logs detalhados podem consumir mais memória, então configure o nível de log para algo como WARN ou ERROR.
Mais possibilidades podem ser encontradas aqui: Spark Configuration.
David Matos
Referências: