Apache Spark s3a committer - pile de thread de problèmes de mémoire

0

La question

J'ai vraiment besoin d'un peu d'aide ici:

Nous sommes à l'aide de Spark3.1.2 utilisation autonome de cluster. Depuis que nous avons commencé à l'aide de la s3a répertoire committer, notre étincelle d'emplois de la stabilité et de la performance a augmenté de manière significative!

Ces derniers temps, cependant, nous sommes complètement dérouté la résolution de ce s3a répertoire committer question de jours, et je me demande si vous avez une idée de ce qui se passe?

Notre étincelle projets échouent à cause de Java OOM (ou plutôt de la limite de processus) erreur:

 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)

Spark Thread Dump montre de plus de 5000 committer threads sur l'étincelle de pilote! Voici un exemple:

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 

Cela est de considérer que nos paramètres de ne pas permettre à plus de 100 threads... Ou que nous ne comprenons pas quelque chose...

Voici nos configurations et paramètres:

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

Nous avons essayé différentes versions de la bougie d'Hadoop sur le cloud la bibliothèque, mais le problème est toujours le même.

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

Nous serions vraiment reconnaissants si vous pouvez nous indiquer la bonne direction

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

La meilleure réponse

3

Ça va être HADOOP-16570 S3A committers de fuite threads/relances OOM sur la tâche s'engager à l'échelle

déplacer jusqu'à hadoop-3.3.0 binaires pour la correction. Idéalement 3.3.1 pour résoudre d'autres problèmes, en particulier en double jobIDs venant de l'étincelle. Vous ne savez pas comment loin dans la CDH de presse que le correctif est allé, j'ai pu travailler si vous en avez vraiment besoin maintenant. Pas CDH6.x, certainement

2021-11-28 12:13:50

Merci beaucoup! En fait tout ce que nous avons fait n'a pas aidé.
Ofer Eliassaf

Notre problème est maintenant de regarder les versions correctes des pilotes - où peut-on aller chercher l'étincelle-cloud pot avec la version pertinente? Sera-ce travail de pilote pour Spark 3.1.2: mvnrepository.com/artifact/org.apache.spark/... ??
Ofer Eliassaf

la spark cloud pot doit être celui de votre étincelle distro, c'est juste une fine reliure de classe
stevel

Salut, Nous essayons de permettre à cette Spark 3.1.2 qui est à venir empaqueté avec Hadoop 3.2. Est-il sécuritaire de fournir l'étincelle-hadoop-cloud pour 3.3.1 ensemble avec Hadoop 3.2 les bibliothèques? (Nous essayons d'aller avec le dégroupage de la version et a obtenu quelques diffuculties avec Zookeeper conservateur des bibliothèques de l'inadéquation de la Goyave. une plus rapide est d'aller avec le logiciel et il suffit d'ajouter le comitter des 3.3.1. Ça va fonctionner?). Merci!
Ofer Eliassaf

utiliser l'étincelle hadoop-cloud-3.1.2; vous aurez besoin d'un ensemble complet de hadoop-3.3.x en parfaite synchronisation. ou backport le livreur patch uniquement pour hadoop 3.2
stevel

Cette étincelle-hadoop-cloud-3.1.2 a ce bug (et il a été un cauchemar pour le trouver puisqu'il n'est pas officiel maven versions). Ce que nous avons fini par faire, c'est: Option 1 (notre configuration actuelle): Utilisation de l'étincelle 3.1.2 dégroupés version. Nous avons ajouté Hadoop 3.3.1 binaires, Nous avons ajouté la spark-hadoop-cloud-3.2.0 pour résoudre le livreur question. Option 2 (que nous considérons): Apportez Spark3.1.2 regroupés (qui vient avec Hadoop 3.2) Et ajouter de l'étincelle-hadoop-cloud-3.2.0 pour la fixation de la comitter issu. Qui est le meilleur à votre avis?
Ofer Eliassaf

Le fil est la fuite dans hadoop-aws; il doit seulement être hadoop-* qui a besoin de mise à jour.
stevel
1

Checkout cet article sur l'optimisation de S3A.

Plus précisément, je regarderais ce, même si sa classés en vertu de tableau:

Vous devrez peut-être effectuer un réglage minutieux afin de réduire le risque de manquer de mémoire, surtout si les données sont mises en mémoire tampon. Il y a un nombre de paramètres qui peuvent être réglés:

Le nombre total de threads disponibles dans le système de fichiers de données les téléchargements ou de tout autre système de fichiers en file d'attente de l'opération. Il est en fs.s3a.les threads.max.

Le nombre d'opérations qui peuvent être mis en file d'attente pour l'exécution, dans l'attente d'une fil de discussion. Il est en fs.s3a.max.total.les tâches.

Le nombre de blocs d'un seul flux de sortie peuvent active (c'est, d'être téléchargées par un thread ou en file d'attente dans le système de fichiers fil de file d'attente). Il est en fs.s3a.rapide.le téléchargement.active.les blocs.

La longueur de temps qu'un thread inactif peut rester dans le pool de threads avant qu'il est à la retraite. Il est en fs.s3a.les threads.keepalivetime.

Je pense que vous pourriez trouver en réduisant le nombre de threads de supprimer de la mémoire.

Je vous conseille aussi de tune fs.s3a.fast.upload.active.blocks il permettra aussi d'alléger la pression sur la mémoire. Je pense que réduire le nombre de threads doit être votre premier déplacement en tant que 100 est un peu agressif. Vous êtes probablement limité à la bande passante et d'autres threads ne sont pas susceptibles de faire n'importe quoi mais consomme de la mémoire.

2021-11-28 12:08:19

Savez-vous ce que le pilote threads sont pour? Si je comprends bien la configuration de threads doit être pour les travailleurs. Quels sont les pilotes de threads pour?
Ofer Eliassaf

Jetez un oeil à s3 valider la documentation.(Pas à 100% la même chose que cela, mais un bon endroit pour apprendre sur s3 & spark) Lien ci-dessous. Il soulève l'idée que les fichiers sont communiquées au conducteur, et qu'ils sont engagés. Nous ne pouvons pas savoir ce qui est la même pour ce fichier écrit, mais il me semble logique, le pilote est le seul qui est au courant du travail de la réussite/l'échec. Je n'ai pas trouver un smoking gun affirmant cela comme vrai, mais il semble raisonnable/plausible. github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/...
Matt Andruff

Ce serait aussi un sens pourquoi l'utilisation des threads 100 par travailleur pourrait finir vers le haut avec 5000 threads dans le pilote et pourquoi à nouveau vous devez envisager d'utiliser un certain nombre qui ne sera pas ajouter beaucoup de pression sur le pilote. (réduire votre nombre de threads)
Matt Andruff

regardez la réponse de @Stevel - il est connu hadoop bug avec les versions antérieures de le valider!
Ofer Eliassaf

Merci beaucoup pour le ping-moi.
Matt Andruff

Dans d'autres langues

Cette page est dans d'autres langues

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