Почему задания Spark терпят неудачу с org.апаш.искра.шарканье.MetadataFetchFailedException: отсутствует выходное местоположение для shuffle 0 в режиме спекуляции?
Я запускаю задание Spark в режиме спекуляции. У меня есть около 500 задач и около 500 файлов 1 ГБ GZ сжатого. Я продолжаю получать в каждом задании, для 1-2 задач, прикрепленную ошибку, где она повторяется после этого десятки раз (предотвращая выполнение задания).
org.апаш.искра.шарканье.MetadataFetchFailedException: отсутствует место вывода для shuffle 0
любая идея, в чем смысл проблемы и как преодолеть это?
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses.apply(MapOutputTracker.scala:384)
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses.apply(MapOutputTracker.scala:381)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
at org.apache.spark.MapOutputTracker$.org$apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:380)
at org.apache.spark.MapOutputTracker.getServerStatuses(MapOutputTracker.scala:176)
at org.apache.spark.shuffle.hash.BlockStoreShuffleFetcher$.fetch(BlockStoreShuffleFetcher.scala:42)
at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:40)
at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:92)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
at org.apache.spark.rdd.FlatMappedRDD.compute(FlatMappedRDD.scala:33)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
at org.apache.spark.scheduler.Task.run(Task.scala:56)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:196)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
7 ответов:
Это произошло со мной, когда я дал больше памяти рабочему узлу, чем у него есть. Поскольку у него не было swap, spark разбился при попытке сохранить объекты для перетасовки, не оставив больше памяти.
решение состояло в том, чтобы либо добавить подкачку, либо настроить рабочий/исполнитель для использования меньшего объема памяти в дополнение к использованию уровня памяти MEMORY_AND_DISK для нескольких повторений.
у нас была аналогичная ошибка с Spark, но я не уверен, что это связано с вашей проблемой.
мы
JavaPairRDD.repartitionAndSortWithinPartitions
на 100 ГБ данных, и он продолжал терпеть неудачу аналогично вашему приложению. Затем мы посмотрели журналы пряжи на конкретных узлах и обнаружили, что у нас есть какая-то проблема с памятью, поэтому пряжа прервала выполнение. Наше решение состояло в том, чтобы изменить / добавитьspark.shuffle.memoryFraction 0
in.../spark/conf/spark-defaults.conf
. Это позволило нам обрабатывать гораздо больший (но, к сожалению, не бесконечный) объем данных таким образом.
я получил ту же проблему на моем 3 машины пряжи кластера. Я продолжал менять ОЗУ, но проблема сохранялась. Наконец я увидел следующие сообщения в журналах:
17/02/20 13:11:02 WARN spark.HeartbeatReceiver: Removing executor 2 with no recent heartbeats: 1006275 ms exceeds timeout 1000000 ms 17/02/20 13:11:02 ERROR cluster.YarnScheduler: Lost executor 2 on 1worker.com: Executor heartbeat timed out after 1006275 ms
и после этого было такое сообщение:
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 67
Я изменил свойства в spark-defaults.conf следующим образом:
spark.yarn.scheduler.heartbeat.interval-ms 7200000 spark.executor.heartbeatInterval 7200000 spark.network.timeout 7200000
вот именно! После этого моя работа была успешно завершена.
в моем случае (автономный кластер) исключение было вызвано тем, что файловая система некоторых ведомых устройств Spark была заполнена на 100%. Удаление всего в
spark/work
папки рабов решили проблему.
Я решил эту ошибку, увеличив выделенную память в executorMemory и driverMemory. Вы можете сделать это в HUE, выбрав программу Spark, которая вызывает проблему, и в списке свойств -> Option вы можете добавить что-то вроде этого:
--driver-memory 10G --executor-memory 10G --num-executors 50 --executor-cores 2
конечно, значения параметров будут варьироваться в зависимости от размера кластера и ваших потребностей.
я получил ту же проблему, но я искал много ответов, которые не могут решить мою проблему. в конце концов, я отлаживаю свой код шаг за шагом. Я считаю, что проблема, вызванная размером данных, не сбалансирована для каждого раздела, что привело к
MetadataFetchFailedException
, что вmap
не
эта проблема о . Вы передаете память, которая недоступна. В команде spark submit есть 3 параметры, касающиеся памяти и исполнения. Эти параметры являются
--driver-memory 1200M --driver-cores 1 --num-executors 1
дайте памяти водителя Макс
n/2
(n
=общая память на узел.)дайте драйвер-ядра
n/1000
(n
=память драйвера (в МБ))дайте num-исполнители
n
(n
= количество узлов )если вы не дадите правильные параметры в команде spark submit, то будет медленный ответ или это вызовет исключение.