स्पार्क जॉब्स org.apache.spark.shuffle.etadataFetchFailedException के साथ विफल क्यों होते हैं: अटकलें मोड में फेरबदल 0 के लिए आउटपुट स्थान गुम?


85

मैं एक स्पार्क मोड के साथ स्पार्क जॉब चला रहा हूं। मेरे पास लगभग 500 कार्य हैं और 1 GB gz की लगभग 500 फाइलें संपीड़ित हैं। मैं प्रत्येक कार्य में 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
क्या आपने कोई LostExecutorINFO संदेश देखा है ? क्या आप वेब यूआई के एक्जिक्यूटर्स पेज की जांच कर सकते हैं और देख सकते हैं कि एग्जीक्यूटर्स कैसे व्यवहार करते हैं, esp। जीसी बुद्धिमान?
जसक लस्कॉस्की

जवाबों:


50

यह मेरे साथ तब हुआ जब मैंने कार्यकर्ता नोड को इसकी तुलना में अधिक मेमोरी दी। चूंकि इसमें स्वैप नहीं था, इसलिए स्पार्कलिंग के लिए वस्तुओं को स्टोर करने की कोशिश करते समय स्पार्क दुर्घटनाग्रस्त हो गया, जिसमें कोई अधिक मेमोरी नहीं बची थी।

समाधान या तो स्वैप जोड़ने के लिए था, या कई बनी रहती है के लिए MEMORY_AND_DISK भंडारण स्तर का उपयोग करने के अलावा कम मेमोरी का उपयोग करने के लिए कार्यकर्ता / निष्पादक को कॉन्फ़िगर करें।


3
यदि आपके पास नोड (मेमोरी) पर एक संसाधन है, तो आप स्पार्क एक्सेसर मेमोरी को बढ़ाने की कोशिश कर सकते हैं। मैं कोशिश करूंगा कि पहले अगर आपको प्रदर्शन की चिंता है।
nir

14
हाय @ जोरेन यह एक प्रतियोगिता नहीं है। ओपी समस्या निष्पादक है जिसमें फेरबदल आउटपुट को स्टोर करने के लिए पर्याप्त मेमोरी नहीं है। आपके लिए जो काम किया गया है, वह निष्पादक मेमोरी को कम नहीं कर रहा है, बल्कि MEMORY_AND_DISK स्टोरेज स्तर का उपयोग कर रहा है जो निष्पादक की मेमोरी सीमा को समाप्त करता है। ओपी निष्पादक के लिए उसके पास कितना संसाधन है, इसके बारे में ओपी नहीं कहता है।
nir

मेरे पास एक ही समस्या है और मैंने निष्पादक मेमोरी बढ़ाने, मरम्मत की राशि बढ़ाने, अधिक भौतिक स्मृति को मुक्त करने जैसे तरीकों की कोशिश की है। और कभी-कभी यह काम करता था जबकि कभी-कभी ऐसा नहीं होता था। मैंने पाया कि यह केवल फेरबदल के चरण में हुआ और मैं पूछना चाहता हूं कि मैं StorageLevel को कहां सेट कर सकता हूं?
Lhfcws 3

मैंने अपनी डेटा संरचना को अनुकूलित किया और इसे ठीक किया। मैंने बस हैशपॉप को एक बाइट में बदल दिया [] जिसे प्रोटॉस्टफ द्वारा क्रमबद्ध किया गया था
Lhfcws

1
स्पार्क.driver.overhead.memory और spark.executor.overhead.memory को एक मान से अधिक बदलने की कोशिश करें कि 384 (डिफ़ॉल्ट) और यह काम करना चाहिए। आप 1024 एमबी या 2048 एमबी का उपयोग कर सकते हैं।
राहुल गुलाटी

14

हमारे पास स्पार्क के साथ एक समान त्रुटि थी, लेकिन मुझे यकीन नहीं है कि यह आपके मुद्दे से संबंधित है।

हमने JavaPairRDD.repartitionAndSortWithinPartitions100GB डेटा का उपयोग किया और यह आपके ऐप के समान विफल रहा। फिर हमने विशिष्ट नोड्स पर यार्न लॉग को देखा और पता चला कि हमारे पास कुछ प्रकार की आउट-ऑफ-मेमोरी समस्या है, इसलिए यार्न ने निष्पादन को बाधित किया। हमारा समाधान बदलना / जोड़ना spark.shuffle.memoryFraction 0था .../spark/conf/spark-defaults.conf। इस तरह से हमें एक बहुत बड़ा (लेकिन दुर्भाग्य से अनंत नहीं) डेटा को संभालने की अनुमति मिली।


क्या यह वास्तव में "0" है या यह टाइपिंग त्रुटि थी? इसके पीछे क्या तर्क है, इसे डिस्क पर स्थायी रूप से फैलाने के लिए मजबूर करने के लिए?
विर्जिल

@ वीरगिल हाँ। हमने कुछ परीक्षण किए। जितना अधिक हम प्रक्रियात्मक राशि को प्राप्त करेंगे, उतना ही शून्य होगा। कीमत 20% समय थी।
नोटिनिस्टल

दिलचस्प है, मैं स्पार्क को भी कम कर देता हूं। शफ़ल। मॉमफ़्रीफ़ॉर्म को शून्य कर दिया गया लेकिन एक पंक्ति में अधिक त्रुटियां मिलीं। (अर्थात्: मेटाडेटाफ़ेचफ़ेल्डएसेप्शन और FetchFailedException इंटरमिट्रीली) यह एक बग / मुद्दा बन जाना चाहिए अगर "ऑल-स्पिल" में "आंशिक रूप से स्पिल" की तुलना में कम त्रुटि हो।
22

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.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

मेरे लिए, मैं बड़े डेटा (लगभग 50 बी पंक्तियों) पर कुछ विंडोिंग कर रहा था और नाव का लोड प्राप्त कर रहा था

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

मैंने निष्पादक मेमोरी और ड्राइवरमेरी में आवंटित मेमोरी को बढ़ाते हुए इस त्रुटि को हल किया। आप स्पार्क प्रोग्राम का चयन करने वाले HUE में ऐसा कर सकते हैं जो समस्या पैदा कर रहा है और गुणों में -> विकल्प सूची आप इस तरह से कुछ जोड़ सकते हैं:

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

बेशक मापदंडों के मूल्य आपके क्लस्टर के आकार और आपकी आवश्यकताओं के आधार पर अलग-अलग होंगे।


1

स्पार्क वेब यूआई में, अगर कुछ जानकारी जैसी है 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

मेरे मामले में (स्टैंडअलोन क्लस्टर) अपवाद को फेंक दिया गया था क्योंकि कुछ स्पार्क दासों की फाइल प्रणाली 100% भर गई थी। spark/workदासों के फ़ोल्डर्स में सब कुछ हटाने से समस्या हल हो गई।


0

मुझे वही समस्या मिली, लेकिन मैंने कई जवाब खोजे जो मेरी समस्या का समाधान नहीं कर सकते। अंत में, मैं अपने कोड चरण को चरण दर चरण डीबग करता हूं। मैं समस्या यह है कि डेटा आकार की वजह से करने के लिए लीडेड प्रत्येक विभाजन के लिए संतुलित नहीं है, लगता है MetadataFetchFailedExceptionकि mapनहीं चरण reduceचरण। df_rdd.repartition(nums)पहले बस करोreduceByKey()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.