Meu cluster: 1 mestre, 11 escravos, cada nó tem 6 GB de memória.
Minhas configurações:
spark.executor.memory=4g, Dspark.akka.frameSize=512
Aqui está o problema:
Primeiro , li alguns dados (2,19 GB) do HDFS para o RDD:
val imageBundleRDD = sc.newAPIHadoopFile(...)
Segundo , faça algo neste RDD:
val res = imageBundleRDD.map(data => {
val desPoints = threeDReconstruction(data._2, bg)
(data._1, desPoints)
})
Por último , saída para HDFS:
res.saveAsNewAPIHadoopFile(...)
Quando executo meu programa, ele mostra:
.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space
Existem muitas tarefas?
PS : Tudo está bem quando os dados de entrada têm cerca de 225 MB.
Como posso resolver este problema?
out-of-memory
apache-spark
hequn8128
fonte
fonte
Respostas:
Tenho algumas sugestões:
spark.executor.memory=6g
,. Verifique se você está usando o máximo de memória possível , verificando a interface do usuário (ele indica quanto mem você está usando)spark.storage.memoryFraction
. Se você não usarcache()
oupersist
no seu código, pode ser zero. O padrão é 0,6, o que significa que você recebe apenas 0,4 * 4g de memória para sua pilha. O IME que reduz o mem frac geralmente faz com que os OOMs desapareçam. ATUALIZAÇÃO: A partir do spark 1.6, aparentemente, não precisamos mais jogar com esses valores, o spark os determinará automaticamente.String
e estruturas muito aninhadas (Map
classes de casos semelhantes e aninhadas). Se possível, tente usar apenas tipos primitivos e indexar todos os não primitivos, especialmente se você espera muitas duplicatas. EscolhaWrappedArray
estruturas aninhadas sempre que possível. Ou até mesmo implante sua própria serialização - você terá mais informações sobre como fazer backup eficiente de seus dados em bytes, USE-O !Dataset
para armazenar em cache sua estrutura, pois ela usará uma serialização mais eficiente. Isso deve ser considerado um hack quando comparado ao ponto anterior. A criação do conhecimento do seu domínio no seu algo / serialização pode minimizar o espaço da memória / cache em 100x ou 1000x, enquanto tudo oDataset
que provavelmente será fornecido é de 2x a 5x na memória e 10x compactado (parquet) no disco.http://spark.apache.org/docs/1.2.1/configuration.html
EDIT: (Para que eu possa me pesquisar no Google mais facilmente) O seguinte também é indicativo desse problema:
fonte
spark.executor.memory
porque definitivamente precisa de uma quantidade de memória para sobrecarga de E / S. Se você usar tudo isso, o programa ficará mais lento. A exceção a isso pode ser o Unix, nesse caso, você tem espaço de troca.Para adicionar um caso de uso a isso que geralmente não é discutido, apresentarei uma solução ao enviar um
Spark
aplicativo viaspark-submit
no modo local .De acordo com o gitbook Mastering Apache Spark de Jacek Laskowski :
Portanto, se você estiver enfrentando
OOM
erros com oheap
, basta ajustar odriver-memory
e não oexecutor-memory
.Aqui está um exemplo:
fonte
Você deve definir as configurações de memória offHeap, conforme mostrado abaixo:
Forneça a memória do driver e do executor conforme a disponibilidade de RAM da sua máquina. Você pode aumentar o tamanho offHeap se ainda estiver enfrentando o problema OutofMemory .
fonte
config
resolveu o problema.Você deve aumentar a memória do driver. Na sua pasta $ SPARK_HOME / conf, você deve encontrar o arquivo
spark-defaults.conf
, editar e definir o quespark.driver.memory 4000m
depende da memória do seu mestre, eu acho. Foi isso que corrigiu o problema para mim e tudo corre sem problemasfonte
Dê uma olhada nos scripts de inicialização em que um tamanho de heap Java está definido, parece que você não está definindo isso antes de executar o trabalhador do Spark.
Você pode encontrar a documentação para implantar scripts aqui .
fonte
start up scripts
Infelizmente, o conteúdo do script vinculado por foi alterado. Nenhuma opção existe até 19/12/2019Sofri muito com esse problema, usamos alocação dinâmica de recursos e achei que ele utilizaria meus recursos de cluster para melhor se adequar ao aplicativo.
Mas a verdade é que a alocação dinâmica de recursos não define a memória do driver e mantém seu valor padrão que é 1g.
Eu o resolvi definindo spark.driver.memory para um número adequado à memória do meu driver (para 32 GB de RAM, eu o configurei para 18 GB)
você pode configurá-lo usando o comando spark submit da seguinte maneira:
Nota muito importante, essa propriedade não será levada em consideração se você a definir a partir do código, de acordo com a documentação do spark:
fonte
Em termos gerais, a memória JVM do Spark Executor pode ser dividida em duas partes. Memória Spark e memória do usuário. Isso é controlado pela propriedade
spark.memory.fraction
- o valor está entre 0 e 1. Ao trabalhar com imagens ou ao realizar processamento intensivo de memória em aplicativos spark, considere diminuir o valorspark.memory.fraction
. Isso disponibilizará mais memória para o seu aplicativo. O Spark pode derramar, por isso ainda funcionará com menos compartilhamento de memória.A segunda parte do problema é a divisão do trabalho. Se possível, particione seus dados em pedaços menores. Dados menores possivelmente precisam de menos memória. Mas se isso não for possível, você estará sacrificando a computação pela memória. Normalmente, um único executor estará executando vários núcleos. A memória total dos executores deve ser suficiente para lidar com os requisitos de memória de todas as tarefas simultâneas. Se aumentar a memória do executor não for uma opção, você poderá diminuir os núcleos por executor para que cada tarefa obtenha mais memória para trabalhar. Teste com 1 executores principais que possuam a maior memória possível e continue aumentando os núcleos até encontrar a melhor contagem de núcleos.
fonte
Você despejou seu mestre gc log? Então, eu encontrei um problema semelhante e achei que SPARK_DRIVER_MEMORY definia apenas o heap Xmx. O tamanho inicial do heap permanece 1G e o tamanho do heap nunca aumenta para o heap Xmx.
Passar "--conf" spark.driver.extraJavaOptions = -Xms20g "resolve meu problema.
ps aux | grep java e você verá o seguinte log: =
24501 30,7 1,7 41782944 2318184 pts / 0 Sl + 18:49 0:33 / usr / java / latest / bin / java -cp / opt / spark / conf /: / opt / spark / jars / * -Xmx30g -Xms20g
fonte
O local para definir o tamanho do heap da memória (pelo menos no spark-1.0.0) é em conf / spark-env. As variáveis relevantes são
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
. Mais documentos estão no guia de implantaçãoAlém disso, não esqueça de copiar o arquivo de configuração para todos os nós escravos.
fonte
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
?SPARK_EXECUTOR_MEMORY
e que erro lhe diria para aumentarSPARK_DRIVER_MEMORY
?Tenho poucas sugestões para o erro mencionado acima.
● Verifique se a memória do executor atribuída como executor pode ter que lidar com partições que exigem mais memória do que a que está atribuída.
● Tente verificar se mais shuffles estão ativos, pois as operações são caras, pois envolvem E / S de disco, serialização de dados e E / S de rede
● Usar junções de transmissão
● Evite usar groupByKeys e tente substituir por ReduceByKey
● Evite usar grandes objetos Java onde quer que ocorra a reprodução aleatória
fonte
Pelo meu entendimento do código fornecido acima, ele carrega o arquivo, mapeia a operação e salva de volta. Não há operação que exija a reprodução aleatória. Além disso, não há operação que exija que os dados sejam trazidos para o driver, portanto, o ajuste de qualquer coisa relacionada ao shuffle ou driver pode não ter impacto. O driver tem problemas quando há muitas tarefas, mas isso foi apenas até a versão 2.0.2. Pode haver duas coisas que estão dando errado.
fonte
Definir essas configurações exatas ajudou a resolver o problema.
fonte