Apache Faísca s3a committer - pilha de thread - problemas de falta de memória

0

Pergunta

Eu realmente preciso de alguma ajuda aqui:

Estamos usando Spark3.1.2 usando autônomo de cluster. Desde que começamos a utilizar o s3a diretório committer, a nossa centelha trabalhos de estabilidade e desempenho cresceu significativamente!

Ultimamente, no entanto, estamos completamente perplexo resolução de problemas este s3a diretório committer questão de dias, e gostaria de saber se você tem alguma idéia do que está acontecendo?

Nossa centelha trabalhos falhar por causa de Java OOM (ou melhor, o processo de limite de erro:

 An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.

: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
    at java.base/java.lang.Thread.start0(Native Method)
    at java.base/java.lang.Thread.start(Thread.java:803)
    at java.base/java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:937)
    at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1343)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
    at java.base/java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:714)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.$anonfun$new$1(MessageLoop.scala:174)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.$anonfun$new$1$adapted(MessageLoop.scala:173)
    at scala.collection.immutable.Range.foreach(Range.scala:158)
    at org.apache.spark.rpc.netty.DedicatedMessageLoop.<init>(MessageLoop.scala:173)
    at org.apache.spark.rpc.netty.Dispatcher.liftedTree1$1(Dispatcher.scala:75)
    at org.apache.spark.rpc.netty.Dispatcher.registerRpcEndpoint(Dispatcher.scala:72)
    at org.apache.spark.rpc.netty.NettyRpcEnv.setupEndpoint(NettyRpcEnv.scala:136)
    at org.apache.spark.storage.BlockManager.<init>(BlockManager.scala:231)
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:394)
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:189)
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:277)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:458)
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:238)
    at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
    at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.base/java.lang.Thread.run(Thread.java:834)

Faísca Thread Dump mostra mais de 5000 committer threads no centelha driver! Aqui está um exemplo:

Thread ID   Thread Name Thread State    Thread Locks
1047    s3-committer-pool-0 WAITING 
1449    s3-committer-pool-0 WAITING 
1468    s3-committer-pool-0 WAITING 
1485    s3-committer-pool-0 WAITING 
1505    s3-committer-pool-0 WAITING 
1524    s3-committer-pool-0 WAITING 
1529    s3-committer-pool-0 WAITING 
1544    s3-committer-pool-0 WAITING 
1549    s3-committer-pool-0 WAITING 
1809    s3-committer-pool-0 WAITING 
1972    s3-committer-pool-0 WAITING 
1998    s3-committer-pool-0 WAITING 
2022    s3-committer-pool-0 WAITING 
2043    s3-committer-pool-0 WAITING 
2416    s3-committer-pool-0 WAITING 
2453    s3-committer-pool-0 WAITING 
2470    s3-committer-pool-0 WAITING 
2517    s3-committer-pool-0 WAITING 
2534    s3-committer-pool-0 WAITING 
2551    s3-committer-pool-0 WAITING 
2580    s3-committer-pool-0 WAITING 
2597    s3-committer-pool-0 WAITING 
2614    s3-committer-pool-0 WAITING 
2631    s3-committer-pool-0 WAITING 
2726    s3-committer-pool-0 WAITING 
2743    s3-committer-pool-0 WAITING 
2763    s3-committer-pool-0 WAITING 
2780    s3-committer-pool-0 WAITING 
2819    s3-committer-pool-0 WAITING 
2841    s3-committer-pool-0 WAITING 
2858    s3-committer-pool-0 WAITING 
2875    s3-committer-pool-0 WAITING 
2925    s3-committer-pool-0 WAITING 
2942    s3-committer-pool-0 WAITING 
2963    s3-committer-pool-0 WAITING 
2980    s3-committer-pool-0 WAITING 
3020    s3-committer-pool-0 WAITING 
3037    s3-committer-pool-0 WAITING 
3055    s3-committer-pool-0 WAITING 
3072    s3-committer-pool-0 WAITING 
3127    s3-committer-pool-0 WAITING 
3144    s3-committer-pool-0 WAITING 
3163    s3-committer-pool-0 WAITING 
3180    s3-committer-pool-0 WAITING 
3222    s3-committer-pool-0 WAITING 
3242    s3-committer-pool-0 WAITING 
3259    s3-committer-pool-0 WAITING 
3278    s3-committer-pool-0 WAITING 
3418    s3-committer-pool-0 WAITING 
3435    s3-committer-pool-0 WAITING 
3452    s3-committer-pool-0 WAITING 
3469    s3-committer-pool-0 WAITING 
3486    s3-committer-pool-0 WAITING 
3491    s3-committer-pool-0 WAITING 
3501    s3-committer-pool-0 WAITING 
3508    s3-committer-pool-0 WAITING 
4029    s3-committer-pool-0 WAITING 
4093    s3-committer-pool-0 WAITING 
4658    s3-committer-pool-0 WAITING 
4666    s3-committer-pool-0 WAITING 
4907    s3-committer-pool-0 WAITING 
5102    s3-committer-pool-0 WAITING 
5119    s3-committer-pool-0 WAITING 
5158    s3-committer-pool-0 WAITING 
5175    s3-committer-pool-0 WAITING 
5192    s3-committer-pool-0 WAITING 
5209    s3-committer-pool-0 WAITING 
5226    s3-committer-pool-0 WAITING 
5395    s3-committer-pool-0 WAITING 
5634    s3-committer-pool-0 WAITING 
5651    s3-committer-pool-0 WAITING 
5668    s3-committer-pool-0 WAITING 
5685    s3-committer-pool-0 WAITING 
5702    s3-committer-pool-0 WAITING 
5722    s3-committer-pool-0 WAITING 
5739    s3-committer-pool-0 WAITING 
6144    s3-committer-pool-0 WAITING 
6167    s3-committer-pool-0 WAITING 
6289    s3-committer-pool-0 WAITING 
6588    s3-committer-pool-0 WAITING 
6628    s3-committer-pool-0 WAITING 
6645    s3-committer-pool-0 WAITING 
6662    s3-committer-pool-0 WAITING 
6675    s3-committer-pool-0 WAITING 
6692    s3-committer-pool-0 WAITING 
6709    s3-committer-pool-0 WAITING 
7049    s3-committer-pool-0 WAITING 

Isto considerando que nossas configurações não permitem mais de 100 tópicos... Ou nós não entender alguma coisa...

Aqui é o nosso configurações e definições:

fs.s3a.threads.max  100 
fs.s3a.connection.maximum  1000 
fs.s3a.committer.threads 16   
fs.s3a.max.total.tasks  5
fs.s3a.committer.name   directory
fs.s3a.fast.upload.buffer                 disk
io.file.buffer.size                                1048576
mapreduce.outputcommitter.factory.scheme.s3a    - org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory

Já havia tentado diferentes versões do faísca Hadoop nuvem biblioteca, mas o problema é consistentemente o mesmo.

https://repository.cloudera.com/content/repositories/releases/org/apache/spark/spark-hadoop-cloud_2.11/2.4.0-cdh6.3.2/spark-hadoop-cloud_2.11-2.4.0-cdh6.3.2.jar

https://repository.cloudera.com/artifactory/libs-release-local/org/apache/spark/spark-hadoop-cloud_2.11/2.4.0.7.0.3.0-79/spark-hadoop-cloud_2.11-2.4.0.7.0.3.0-79.jar

https://repo1.maven.org/maven2/org/apache/spark/spark-hadoop-cloud_2.12/3.2.0/spark-hadoop-cloud_2.12-3.2.0.jar

https://repository.cloudera.com/artifactory/libs-release-local/org/apache/spark/spark-hadoop-cloud_2.12/3.1.2.7.2.12.0-291/spark-hadoop-cloud_2.12-3.1.2.7.2.12.0-291.jar

Nós tínhamos realmente aprecio se você pode apontar-nos na direção certa

amazon-s3 apache-spark hadoop java
2021-11-23 16:49:54
2

Melhor resposta

3

Ele vai ser o HADOOP-16570 S3A committers vazamento de threads/levanta OOM no trabalho/tarefa confirmar em escala

mover para cima para o hadoop-3.3.0 binários para a correção. Idealmente, para 3.3.1 para corrigir alguns outros problemas, especialmente duplicado jobIDs provenientes de faísca. Não sabe ao certo como longe de volta na CDH versões de correcção fui; eu poderia funcionar se você realmente precisa agora. Não CDH6.x, certamente

2021-11-28 12:13:50

Muito obrigado! De fato, tudo o que fizemos não ajuda.
Ofer Eliassaf

O nosso problema agora é para procurar os drivers corretos - onde podemos buscar faísca nuvem frasco com a versão relevante? Será que este trabalho de driver de Ignição 3.1.2: mvnrepository.com/artifact/org.apache.spark/... ??
Ofer Eliassaf

a faísca nuvem frasco deve ser a sua vela de distro; é apenas uma fina camada de enlace de classe
stevel

Oi, Estamos tentando habilitar isso no Centelha 3.1.2 o que está vindo junto com o Hadoop 3.2. É seguro fornecer a faísca do hadoop-cloud para 3.3.1 juntamente com o Hadoop 3.2 bibliotecas? (Estamos tentando ir com a última milha versão e tenho alguns diffuculties com Zookeeper curador bibliotecas de incompatibilidade para Goiaba. uma pista mais rápida será entrar com o pacote e adicionar apenas o comitter de 3.3.1. Será que funciona?). Obrigado!
Ofer Eliassaf

use a faísca do hadoop-nuvem-3.1.2; você vai precisar de um conjunto completo de hadoop-3.3.x em perfeita sincronia. ou adaptar o committer patch apenas para o hadoop 3.2
stevel

Esta faísca hadoop-nuvem-3.1.2 tem esse erro (e foi um pesadelo para encontrá-lo, pois não é oficial maven lançamentos). O que acabamos fazendo é: Opção 1 (a nossa configuração atual): Use a faísca 3.1.2 desagregado versão. Nós adicionamos Hadoop 3.3.1 binários Nós adicionamos faísca hadoop-nuvem-3.2.0 para resolver o committer problema. Opção 2 (que consideramos a): Trazer Spark3.1.2 pacotes (que vem com o Hadoop 3.2) E adicionar faísca hadoop-nuvem-3.2.0 para a fixação do comitter issu. Qual é o melhor na sua opinião?
Ofer Eliassaf

O segmento de vazamento é no hadoop-aws; ele só deve ser hadoop-* o que precisa de atualização.
stevel
1

Checkout este artigo sobre tuning para S3A.

Especificamente, eu gostaria de olhar para esta, apesar de sua categorizadas de acordo com a matriz:

Você pode precisar para realizar o cuidado de ajuste para reduzir o risco de falta de memória, especialmente se os dados são armazenados na memória. Há um o número de parâmetros que podem ser ajustados:

O número total de linhas disponíveis no sistema de arquivos para dados de carregamentos ou qualquer outro sistema de arquivos na fila de operação. Isso é definido no fs.s3a.threads.max.

O número de operações que podem ser colocadas em fila para execução, à espera de uma thread. Isso é definido no fs.s3a.max.total.tarefas.

O número de blocos que um único fluxo de saída pode ser activa (isto é, de serem enviados por um thread ou em fila de espera no sistema de arquivos fila de thread). Isso é definido no fs.s3a.rápido.upload.active.blocos.

O período de tempo que um thread ocioso pode ficar no pool de threads antes de ele está aposentado. Isso é definido no fs.s3a.threads.keepalivetime.

Eu acho que você pode encontrar reduzir o número de threads irá remover a pressão de memória.

Eu sugiro que você também sintonizar fs.s3a.fast.upload.active.blocks ele também irá aliviar a pressão de memória. Eu acho que reduzir a contagem de thread deve ser seu primeiro passo como 100 é um pouco agressivo. Provavelmente, você está tampado na largura de banda e extra threads não são susceptíveis de fazer qualquer coisa, mas consome memória.

2021-11-28 12:08:19

Você sabe o que é o controlador threads são para que? Se eu entendi corretamente a configuração de segmentos deve ser para os trabalhadores. O que são os drivers de tópicos?
Ofer Eliassaf

Dê uma olhada no s3 committer documentação.(Não 100%, o mesmo que este, mas um bom lugar para aprender sobre o s3 & spark), LInk abaixo. Ele levanta a idéia de que os arquivos são transmitidos ao controlador, e que eles estão comprometidos. Não podemos saber isso é o mesmo para este ficheiro escrever, mas parece lógico, como o driver é o único que sabe o trabalho teve êxito/falha. Eu não encontrar um smoking gun afirmando isso como verdade, mas parece razoável/plausível. github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/...
Matt Andruff

Este seria também, em seguida, faz sentido por que usar 100 linhas por trabalhador poderia acabar com 5000 threads no driver, e por que, novamente, você deve considerar usar um número que não vai adicionar muita pressão sobre o driver. (reduzir sua contagem de thread)
Matt Andruff

olha a resposta do @Stevel - ele é um conhecido hadoop bug com versões anteriores do committer!
Ofer Eliassaf

Obrigado muito muito para a execução de ping-me.
Matt Andruff

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................