Чому завдання Spark не справляються з org.apache.spark.shuffle.MetadataFetchFailedException: Немає вихідного розташування для перетасовки 0 у режимі спекуляції?


85

Я запускаю роботу 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
Ви бачили якісь інформаційні LostExecutorповідомлення? Чи можете ви перевірити сторінку виконавців веб-інтерфейсу та побачити, як поводяться виконавці, особливо. GC-мудрий?
Яцек Ласковський

Відповіді:


50

Це трапилося зі мною, коли я віддав робочому вузлу більше пам'яті, ніж він має. Оскільки у нього не було обміну, іскра розбилася, намагаючись зберегти об'єкти для перетасовки, не залишивши більше пам'яті.

Рішення полягало в тому, щоб або додати обмін, або налаштувати працівника / виконавця, щоб він використовував менше пам'яті, крім того, використовуючи рівень зберігання MEMORY_AND_DISK протягом декількох персистів.


3
Якщо у вас є ресурс на вузлі (пам’яті), ви можете спробувати збільшити пам’ять виконавця іскри. Я спробую це спочатку, якщо вас також турбує продуктивність.
нір

14
Привіт @Joren, це не змагання. Проблема OP полягає в тому, що у виконавця недостатньо пам'яті для зберігання вихідних даних у випадковому порядку. Для вас спрацювало не зменшення пам'яті виконавця, а використання рівня пам'яті MEMORY_AND_DISK, що виключає обмеження пам'яті виконавця. Також ОП не говорить про те, скільки ресурсів він має для виконавця.
нір

У мене така сама проблема, і я пробував такі методи, як збільшення пам'яті виконавця, збільшення кількості переділів, звільнення більше фізичної пам'яті. І іноді це спрацьовувало, а іноді ні. Я виявив, що це сталося лише у фазі перетасовки читання, і я хотів би запитати, де я можу встановити рівень зберігання?
Lhfcws

Я оптимізував свою структуру даних і виправив її. Я щойно змінив HashMap на байт [], який був серіалізований протостуфами
Lhfcws

1
Спробуйте змінити spark.driver.overhead.memory та spark.executor.overhead.memory на значення більше 384 (за замовчуванням), і це повинно працювати. Ви можете використовувати 1024 МБ або 2048 МБ.
rahul gulati

14

У нас була подібна помилка із Spark, але я не впевнений, що це пов’язано з вашою проблемою.

Ми використовували JavaPairRDD.repartitionAndSortWithinPartitions100 Гб даних, і вони продовжували відмовляти, як і ваш додаток. Потім ми переглянули журнали Yarn на конкретних вузлах і з’ясували, що у нас є якась проблема, пов’язана з відсутністю пам’яті, тому Yarn перервала виконання. Наше рішення було змінити / додати spark.shuffle.memoryFraction 0в .../spark/conf/spark-defaults.conf. Це дозволило нам обробляти набагато більший (але, на жаль, нескінченний) обсяг даних таким чином.


Це справді "0" чи це помилка друку? Яка логіка цього, щоб змусити його постійно виливатися на диск?
Вергілій

@Virgil Так. Ми зробили кілька тестів. Чим ближче ми до нуля, тим більше оброблювана сума отримувала. Ціна становила 20% часу.
Notinlist

Цікаво, я також зменшую spark.shuffle.memoryFraction до нуля, але отримую більше помилок підряд. (А саме: MetadataFetchFailedException та FetchFailedException з перервами) Це повинно стати помилкою / проблемою, якщо "all-spill" має менше помилок, ніж "частково-розлив".
tribbloid

11

Я отримав таку саму проблему на моєму 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

Це воно! Моя робота після цього успішно виконана.


У іскрових документи, він сказав: spark.executor.heartbeatInterval should be significantly less than spark.network.timeout. Отже, встановлення для них обох однакових значень може бути не найкращою ідеєю.
Біцвазький,

2

Для мене я робив деякі вікна на великі дані (близько 50B рядків) і отримував завантаження човна

ExternalAppendOnlyUnsafeRowArray:54 - Досягнуто порогу розливу 4096 рядків, перемикання на org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter

У моїх журналах. Очевидно, що 4096 може бути невеликим за такого розміру даних ... це призвело мене до наступного JIRA:

https://issues.apache.org/jira/browse/SPARK-21595

І зрештою до наступних двох параметрів конфігурації:

  • spark.sql.windowExec.buffer.spill.threshold
  • spark.sql.windowExec.buffer.in.memory.threshold

Обидва за замовчуванням - 4096; Я підняв їх набагато вище (2097152), і зараз, здається, справи йдуть добре. Я не впевнений на 100%, що це те саме, що питання, порушене тут, але інша справа спробувати.


1

Я вирішив цю помилку, збільшивши виділену пам'ять у executorMemory та driverMemory. Ви можете зробити це в HUE, вибравши програму Spark, яка спричиняє проблему, а у властивостях -> Список опцій ви можете додати щось подібне:

--driver-memory 10G --executor-memory 10G --num-executors 50 --executor-cores 2

Звичайно, значення параметрів будуть змінюватися залежно від розміру кластера та ваших потреб.


1

у веб-інтерфейсі Spark, якщо є якась інформація, наприклад Executors lost, вам потрібно перевірити журнал пряжі, переконатися, що ваш контейнер вбито.

Якщо контейнер був убитий, можливо, це пов’язано з відсутністю пам’яті.

Як знайти ключову інформацію в журналах пряжі? Наприклад, можуть бути такі попередження:

Container killed by YARN for exceeding memory limits. 2.5 GB of 2.5 GB physical memory used. 
Consider boosting spark.yarn.executor.memoryOverhead.

У цьому випадку це передбачає збільшення spark.yarn.executor.memoryOverhead.


0

У моєму випадку (автономний кластер) було вилучено виняток, оскільки файлова система деяких підлеглих Spark була заповнена на 100%. Видалення всього, що було в spark/workпапках рабів, вирішило проблему.


0

У мене така сама проблема, але я шукав багато відповідей, які не можуть вирішити мою проблему. зрештою, я налагоджую свій код поетапно. Я вважаю, що проблема, спричинена розміром даних, не збалансована для кожного розділу, що призвело до того, MetadataFetchFailedExceptionщо mapстадія не reduceстадія. просто зробітьdf_rdd.repartition(nums) ранішеreduceByKey()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.