FetchFailedException ou MetadataFetchFailedException lors du traitement des big data set
Lorsque j'exécute le code d'analyse avec 1 GO de dataset il se termine sans erreur. Mais, quand j'essaye de 25 go de données à un moment j'en dessous des erreurs. J'essaie de comprendre comment puis-je éviter en dessous des échecs. Heureux d'entendre vos suggestions ou idées.
Différentes erreurs,
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
org.apache.spark.shuffle.FetchFailedException: Failed to connect to ip-xxxxxxxx
org.apache.spark.shuffle.FetchFailedException: Error in opening FileSegmentManagedBuffer{file=/mnt/yarn/nm/usercache/xxxx/appcache/application_1450751731124_8446/blockmgr-8a7b17b8-f4c3-45e7-aea8-8b0a7481be55/08/shuffle_0_224_0.data, offset=12329181, length=2104094}
Cluster Détails:
Fil: 8 Nœuds
Total de cœurs: 64
Mémoire: 500 GO
Spark Version: 1.5
Étincelle soumettre déclaration:
spark-submit --master yarn-cluster \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \
--executor-memory 4g \
--driver-memory 16g \
--num-executors 50 \
--deploy-mode cluster \
--executor-cores 1 \
--class my.parser \
myparser.jar \
-input xxx \
-output xxxx \
L'un des trace de la pile:
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:460)
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:456)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
at org.apache.spark.MapOutputTracker$.org$apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:456)
at org.apache.spark.MapOutputTracker.getMapSizesByExecutorId(MapOutputTracker.scala:183)
at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:47)
at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:90)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:88)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Vous devez vous connecter pour publier un commentaire.
Cette erreur est presque assuré d'être causés par des problèmes de mémoire sur votre exécuteurs testamentaires. Je peux penser à un couple de façons de répondre à ces types de problèmes.
1) Vous pouvez essayer d'exécuter avec plus de partitions (faire un
repartition
sur votredataframe
). Des problèmes de mémoire apparaissent généralement quand une ou plusieurs partitions de contenir plus de données que ne le fit dans la mémoire.2) je m'aperçois que vous n'avez pas défini explicitement
spark.yarn.executor.memoryOverhead
, de sorte qu'il sera, par défaut,max(386, 0.10* executorMemory)
qui, dans votre cas, sera de 400 mo. Que les sons de basse pour moi. Je voudrais essayer de l'augmenter à-dire 1 go de ram (notez que si vous augmentez memoryOverhead à 1 go, vous avez besoin pour réduire--executor-memory
à 3 go)3) Rechercher dans les fichiers journaux sur le défaut de nœuds. Vous voulez regarder pour le texte de "Tuer" conteneur. Si vous voyez le texte "en cours d'exécution-delà des limites de la mémoire physique", l'augmentation de memoryOverhead dans mon expérience de résoudre le problème.
En plus de la mémoire et de réseau config questions décrites ci-dessus, il est intéressant de noter que pour de grandes tables (par exemple, plusieurs to ici), org.apache.spark.shuffle.FetchFailedException peuvent survenir à cause du délai d'attente de la récupération shuffle partitions. Pour résoudre ce problème, vous pouvez définir les options suivantes:
J'ai aussi eu de bons résultats en augmentant l'Étincelle délai
spark.network.timeout
à une plus grande valeur comme 800. La valeur par défaut de 120 secondes va causer beaucoup de vos exécuteurs testamentaires de temps quand sous une lourde charge.D'accord, c'est un vieux thread et il y a assez peu de réponses autour de sur Stackoverflow mais j'ai perdu une couple de jours pour cette erreur et je pense que le partage de l'histoire peut aider.
Il ya effectivement un couple de façons cela peut arriver. Comme Glennie la grande réponse mentionné, il s'agit probablement d'un problème de mémoire donc, assurez-vous que vous avez assez de mémoire pour tout. Il y a le conteneur de mémoire, je SUIS de la mémoire, de la carte-mémoire, de réduire la mémoire, etc. les configurations de regarder dehors pour. La lecture cette peut avoir beaucoup d'aide pour trouver la bonne configuration. Vous devez choisir les numéros de vous-même, mais voici quelques-unes des propriétés que j'ai mis.
yarn-site.xml
mapred-site.xml
Ces permet de résoudre certains autres erreurs que vous pourriez rencontrer, comme PySpark shell plantage au démarrage. Mais dans mon cas, bien que certaines erreurs ont disparu (comme le MetadataFetchFailed erreurs), le problème a persisté. L'erreur exacte était:
Après avoir joué avec tous les possible de FILS d'Allumage et de la propriété de l'Étincelle délais d'attente pour le FIL shuffle service, j'ai fini par réaliser que dans les journaux d'erreur de l'échec du conteneur est à la recherche d'
x.x.x.x
, le local (interne) IP lors de l'exécution denetstat -tulpn | grep <PORT NUM>
y renvoyée.y.y.y:34085 dans qui y de la.y.y.y est le externe adresse IP. Ce n'était pas un problème de mémoire, c'était simplement un problème de configuration réseau.L'Étincelle de service a été de liaison à l'interface externe seulement, parce que le nom a été associé à l'adresse IP externe dans
/etc/hosts
. Après la mise à jour de la/etc/hosts
fichier le problème a été résolu.Bas de ligne:
L'erreur indique bien évidemment certains conteneur n'est pas en mesure d'atteindre un autre. C'est généralement en raison de l'échec des conteneurs à cause de problèmes de mémoire, mais il peut aussi bien être un problème de réseau montre donc pour ceux qui sont trop, surtout si vous avez plusieurs interfaces sur vos nœuds.
Si tous les shuffle tâches à défaut, puis d'une raison probable peut être la dépendance conflcit pour netty.
À l'exclusion de netty avec des dépendances de la spark-core a fonctionné pour moi.