Почему спам не работает с org.apache.spark.shuffle.MetadataFetchFailedException: Отсутствует местоположение вывода для перетасовки 0 в режиме спекуляции?
Я запускаю работу Spark в режиме спекуляции. У меня около 500 задач и около 500 файлов с объемом 1 ГБ. Я продолжаю работать в каждой задаче, для 1-2 задач, приложенной ошибки, где она повторяется несколько десятков раз (чтобы не завершить работу).
org.apache.spark.shuffle.MetadataFetchFailedException: Отсутствует местоположение вывода для перетасовки 0
Любая идея, в чем смысл проблемы и как ее преодолеть?
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:384)
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:381)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.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)
Ответы
Ответ 1
Это случилось со мной, когда я дал больше памяти работнику node, чем он. Поскольку у него не было свопа, искра разбилась, пытаясь сохранить объекты для перетасовки, оставив больше памяти.
Решение заключалось в том, чтобы либо добавить swap, либо настроить рабочий/исполнитель на использование меньше памяти в дополнение к использованию уровня хранения MEMORY_AND_DISK для нескольких сохраняемых объектов.
Ответ 2
У нас была аналогичная ошибка с Spark, но я не уверен, что это связано с вашей проблемой.
Мы использовали JavaPairRDD.repartitionAndSortWithinPartitions
на 100 ГБ данных, и он продолжал сбой аналогично вашему приложению. Затем мы посмотрели журналы Yarn на конкретных узлах и выяснили, что у нас есть проблема с памятью, поэтому пряжа прервала выполнение. Наше решение состояло в том, чтобы изменить/добавить spark.shuffle.memoryFraction 0
в .../spark/conf/spark-defaults.conf
. Это позволило нам обрабатывать гораздо больший (но, к сожалению, не бесконечный) объем данных таким образом.
Ответ 3
У меня такая же проблема на моем трехмерном кластере YARN. Я продолжал менять оперативную память, но проблема сохранялась. Наконец, я видел следующие сообщения в журналах:
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
Что это! После этого моя работа завершилась успешно.
Ответ 4
В моем случае (автономный кластер) исключение было выбрано потому, что файловая система некоторых подчиненных Spark была заполнена на 100%. Удаление всех в папках spark/work
подчиненных устройств решило проблему.
Ответ 5
Я решил эту ошибку увеличить выделенную память в executorMemory и driverMemory. Вы можете сделать это в HUE, выбрав программу Spark, которая вызывает проблему, а в свойствах → Список опций вы можете добавить что-то вроде этого:
--driver-memory 10G --executor-memory 10G --num-executors 50 --executor-cores 2
Разумеется, значения параметров будут различаться в зависимости от размера вашего кластера и ваших потребностей.
Ответ 6
У меня такая же проблема, но я искал много ответов, которые не могут решить мою проблему. в конце концов, я отлаживаю свой код шаг за шагом. Я нахожу, что проблема, вызванная размером данных, не сбалансирована для каждого раздела, что привело к MetadataFetchFailedException
что на этапе map
не reduce
стадию. просто сделайте df_rdd.repartition(nums)
перед reduceByKey()
Ответ 7
Эта проблема касается памяти. Вы передаете память, которая недоступна. В команде запроса искры есть 3 параметры памяти и исполнения. Этими параметрами являются
--driver-memory 1200M
--driver-cores 1
--num-executors 1
Дайте память драйвера max n/2
(n
= общая память node.)
Дайте драйверные ядра n/1000
(n
= память драйвера (в MB))
Дайте num-executors n
(n
= количество узлов, которые у вас есть)
Если вы не укажете правильные параметры в команде запроса искры, тогда будет медленный ответ или это вызовет исключение.