Почему задания 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 57

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, то будет медленный ответ или это вызовет исключение.