Spark işleri neden org.apache.spark.shuffle.MetadataFetchFailedException ile başarısız oluyor: Spekülasyon modunda karıştırma 0 için bir çıktı konumu eksik?


88

Spekülasyon modunda bir Spark işi yürütüyorum. Yaklaşık 500 görevim ve sıkıştırılmış 1 GB gz'lik yaklaşık 500 dosyam var. Her işe girmeye devam ediyorum, 1-2 görev için, daha sonra düzinelerce kez yeniden çalıştığı ekli hata (işin tamamlanmasını engelliyor).

org.apache.spark.shuffle.MetadataFetchFailedException: Karıştırma 0 için bir çıktı konumu eksik

Problemin anlamı nedir ve nasıl üstesinden gelineceği hakkında bir fikriniz var mı?

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
Herhangi bir LostExecutorBİLGİ mesajı gördünüz mü ? Web arayüzünün Executors sayfasını kontrol edebilir ve uygulayıcıların nasıl davrandığını görebilir misiniz, özellikle. GC-bilge?
Jacek Laskowski

Yanıtlar:


52

Bu, işçi düğümüne sahip olduğundan daha fazla bellek verdiğimde başıma geldi. Takas olmadığından, daha fazla bellek kalmadan nesneleri karıştırmak için depolamaya çalışırken kıvılcım çöktü.

Çözüm, ya takas eklemek ya da çalışanı / yürütücüyü birkaç kalıcılık için MEMORY_AND_DISK depolama seviyesini kullanmaya ek olarak daha az bellek kullanacak şekilde yapılandırmaktı.


3
Düğümde (bellek) bir kaynağınız varsa, spark çalıştırıcı belleğini artırmayı deneyebilirsiniz. Performans konusunda da endişeleriniz varsa, önce bunu deneyeceğim.
nir

15
Merhaba @Joren, bu bir rekabet değil. OP sorunu yürütücünün karışık çıktıyı depolamak için yeterli belleğe sahip olmamasıdır. Sizin için işe yarayan şey, yürütme belleğini azaltmak değil, yürütücünün bellek sınırlamasını ortadan kaldıran MEMORY_AND_DISK depolama seviyesini kullanmaktır. Ayrıca OP, yürütücü için ne kadar kaynağı olduğunu söylemiyor.
nir

Aynı sorunu yaşıyorum ve yürütme belleğini artırma, yeniden bölümleme miktarını artırma, daha fazla fiziksel bellek boşaltma gibi yöntemler denedim. Ve bazen işe yaradı, bazen işe yaramadı. Bunun yalnızca karışık okuma aşamasında olduğunu buldum ve StorageLevel'i nereye ayarlayabilirim?
Lhfcws

Veri yapımı optimize ettim ve düzelttim. HashMap'i protostuff tarafından serileştirilen bir bayta [] değiştirdim
Lhfcws

1
Spark.driver.overhead.memory ve spark.executor.overhead.memory'yi 384'ten (Varsayılan) daha büyük bir değere değiştirmeye çalışın ve çalışmalıdır. 1024 MB veya 2048 MB kullanabilirsiniz.
rahul gulati

15

Spark'ta da benzer bir hata aldık, ancak bunun sorununuzla ilgili olduğundan emin değilim.

JavaPairRDD.repartitionAndSortWithinPartitions100 GB veri kullandık ve uygulamanıza benzer şekilde başarısız olmaya devam etti. Daha sonra, belirli düğümlerdeki İplik günlüklerine baktık ve bir tür bellek yetersizliği sorunumuz olduğunu gördük, bu nedenle İplik yürütmeyi durdurdu. Bizim çözümümüz değiştirmek / eklemek spark.shuffle.memoryFraction 0oldu .../spark/conf/spark-defaults.conf. Bu, çok daha büyük (ama ne yazık ki sonsuz değil) miktarda veriyi bu şekilde işlememize izin verdi.


Gerçekten "0" mı yoksa bu bir yazım hatası mıydı? Kalıcı olarak diske dökülmeye zorlamanın ardındaki mantık nedir?
Virgil

@Virgil Evet. Bazı testler yaptık. Sıfıra ne kadar yakın olursak işlenebilir miktar o kadar büyür. Fiyat zamanın% 20'siydi.
Notinlist

İlginçtir, spark.shuffle.memoryFraction'ı sıfıra indirdim ancak art arda daha fazla hata aldım. (Yani: MetadataFetchFailedException ve FetchFailedException aralıklı olarak) Eğer "tamamen dökülme", ​​"kısmen dökülme" den daha az hata içeriyorsa, bir hata / sorun haline gelmelidir.
tribbloid

11

3 makine YARN kümemde de aynı sorunu yaşadım. RAM'i değiştirmeye devam ettim ama sorun devam etti. Sonunda günlüklerde aşağıdaki mesajları gördüm:

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

ve bundan sonra şu mesaj vardı:

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 67

Spark-defaults.conf dosyasındaki özellikleri şu şekilde değiştirdim:

spark.yarn.scheduler.heartbeat.interval-ms 7200000
spark.executor.heartbeatInterval 7200000
spark.network.timeout 7200000

Bu kadar! Bundan sonra işim başarıyla tamamlandı.


1
Kıvılcım docs, bu söylenir: spark.executor.heartbeatInterval should be significantly less than spark.network.timeout. Bu nedenle, ikisini de aynı değere ayarlamak en iyi fikir olmayabilir.
Bitswazsky

2

ExecutorMemory ve driverMemory'de ayrılmış belleği artırarak bu hatayı çözdüm. Bunu HUE'de soruna neden olan Spark Programını seçerek yapabilirsiniz ve özellikler -> Seçenek listesinde buna benzer bir şey ekleyebilirsiniz:

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

Elbette parametrelerin değerleri kümenizin büyüklüğüne ve ihtiyaçlarınıza göre değişecektir.


2

Benim için, büyük verilerde (yaklaşık 50 milyar satır) biraz pencereleme yapıyordum ve bir tekne yükü alıyordum.

ExternalAppendOnlyUnsafeRowArray:54 - 4096 satırlık dökülme eşiğine ulaşıldı, org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter

Günlüklerimde. Açıkçası 4096 böyle bir veri boyutunda küçük olabilir ... bu beni aşağıdaki JIRA'ya yönlendirdi:

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

Ve nihayetinde aşağıdaki iki yapılandırma seçeneğine:

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

Her ikisi de varsayılan olarak 4096'dır; Onları çok daha yükseğe çıkardım (2097152) ve şimdi işler iyi gidiyor gibi görünüyor. Bunun burada belirtilen sorunla aynı olduğundan% 100 emin değilim, ama denenecek başka bir şey.


1

Spark Web kullanıcı arayüzünde, gibi bazı bilgiler varsa Executors lost, o zaman iplik günlüğünü kontrol etmeniz, kabınızın öldürülüp öldürülmediğinden emin olmanız gerekir.

Konteyner öldürüldüyse, muhtemelen hafıza yetersizliğinden kaynaklanmaktadır.

İplik kütüklerinde anahtar bilgiler nasıl bulunur? Örneğin, bunun gibi bazı uyarılar olabilir:

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

Bu durumda artmanız gerektiğini önerir spark.yarn.executor.memoryOverhead.


0

Benim durumumda (bağımsız küme) istisna atıldı çünkü bazı Spark slave'lerinin dosya sistemi% 100 dolduruldu. spark/workKölelerin klasörlerindeki her şeyi silmek sorunu çözdü.


0

Aynı problemi aldım ama problemimi çözemeyecek birçok cevap aradım. sonunda, adım adım kodumda hata ayıkladım. Veri boyutunun neden olduğu problemin her bölüm için dengeli MetadataFetchFailedExceptionolmadığını, mapaşamada değil reduceaşamada yol açtığını görüyorum . sadece df_rdd.repartition(nums)önce yapreduceByKey()

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.