दिलचस्प पोस्ट
टेक्स्टफ़ाइल ले जाएं जब कुंजीपटल तेजी से दिखता है कस्टम एट्रिब्यूट का कंसट्रक्टर रन कब है? क्या एक स्ट्रिंग को फ़ंक्शन में कनवर्ट करने के लिए ईवल का उपयोग करना बुरा है? एंड्रॉइड लंबित इंस्टेंट क्या है? पायथन में, मैं सूची में सभी वस्तुओं को फ़्लोट्स में कैसे रूपांतरित कर सकता हूं? यूआईएलबल में पाठ की कई पंक्तियाँ <Input type = "text" /> में इनपुट के कई लाइनें क्या चयन बॉक्स में केंद्र पाठ संभव है? परिवर्तनीय उत्थापन मैं अपने वेब साइट पर जाने वाले कंप्यूटरों की विशिष्ट पहचान कैसे करूं? एंड्रॉइड डेवलपर कंसोल पर एप्लिकेशन सूची से एप्लिकेशन को कैसे निकाला जाए विभिन्न ब्राउज़र में सरणी सॉर्टिंग स्थिरता Android Marshmallow पर लीगेसी अपाचे HTTP क्लाइंट का उपयोग कैसे करें? पायथन में लूप के लिए सूची तत्वों को कैसे निकालें? ओडीबीसी के बिना जावा से ऐक्सेस डाटाबेस को जोड़ना

स्पार्क java.lang.OutOfMemoryError: जावा हीप स्पेस

मेरा क्लस्टर: 1 मास्टर, 11 गुलाम, प्रत्येक नोड में 6 जीबी मेमोरी है

मेरी सेटिंग्स:

spark.executor.memory=4g, Dspark.akka.frameSize=512 

यहां समस्या है:

सबसे पहले , मैंने HDFS से RDD से कुछ डेटा (2.1 9 जीबी) पढ़ा है:

 val imageBundleRDD = sc.newAPIHadoopFile(...) 

दूसरा , इस RDD पर कुछ करें:

 val res = imageBundleRDD.map(data => { val desPoints = threeDReconstruction(data._2, bg) (data._1, desPoints) }) 

अंतिम , एचडीएफएस के लिए आउटपुट:

 res.saveAsNewAPIHadoopFile(...) 

जब मैं अपना कार्यक्रम चलाता हूं तो यह दिखाता है:

 ..... 14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL) 14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms 14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL) 14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms 14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL) Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark] java.lang.OutOfMemoryError: Java heap space 

बहुत सारे कार्य हैं?

पुनश्च : ठीक है जब इनपुट डेटा 225 एमबी के बारे में है।

इस समस्या का समाधान किस प्रकार से किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "स्पार्क java.lang.OutOfMemoryError: जावा हीप स्पेस"

मेरे पास कुछ सुझाव हैं:

  • यदि आपके नोड्स को स्पार्क (और अन्य प्रक्रियाओं के लिए थोड़ा सा छोड़कर) के लिए 6 जी अधिकतम है, तो कॉन्फ़िगर किया गया है, तो 4g के बजाय 6g का उपयोग करें, spark.executor.memory=6g । सुनिश्चित करें कि आप UI को चेक करके जितना संभव हो सके उतनी मेमोरी का उपयोग कर रहे हैं (यह कहेंगे कि आप कितने मेमो का उपयोग कर रहे हैं)
  • अधिक विभाजन का उपयोग करने की कोशिश करें, आपके पास 2 – 4 प्रति सीपीयू होना चाहिए। आईएमई विभाजन की संख्या में वृद्धि करना अक्सर एक प्रोग्राम को और अधिक स्थिर (और अक्सर तेज़ी से) बनाने का सबसे आसान तरीका है। बड़ी मात्रा में डेटा के लिए आपको 4 से अधिक सीपीयू की आवश्यकता हो सकती है, मुझे कुछ मामलों में 8000 विभाजन का उपयोग करना पड़ता है!
  • spark.storage.memoryFraction लिए आरक्षित स्मृति का अंश घटाएं, spark.storage.memoryFractionspark.storage.memoryFractionमेमोरी spark.storage.memoryFraction का उपयोग कर। यदि आप cache() उपयोग नहीं करते हैं या आपके कोड में persist , तो यह भी 0 हो सकता है। यह डिफ़ॉल्ट है 0.6, जिसका अर्थ है कि आप केवल आपके ढेर के लिए 0.4 * 4 जी मेमोरी प्राप्त करते हैं। आईएमई मेम फ्रैक कम करने में अक्सर OOMs चले जाते हैं अद्यतन: स्पार्क 1.6 से जाहिरा तौर पर हमें इन मूल्यों के साथ खेलने की आवश्यकता नहीं होगी, स्पार्क उन्हें स्वचालित रूप से निर्धारित करेगा
  • उपरोक्त के समान, लेकिन मेमोरी अंश को फेरबदल करना यदि आपकी नौकरी में बहुत फेरबदल की स्मृति की आवश्यकता नहीं है, तो इसे कम मूल्य पर सेट करें (यह आपके घसीटना डिस्क पर गिरने के कारण हो सकता है जो गति पर भयावह प्रभाव डाल सकता है) कभी-कभी जब यह एक ओढ़ना है जो ओमिंग है, तो आपको इसके विपरीत करने की आवश्यकता है, यानी इसे किसी बड़े, 0.8 जैसे, या यह सुनिश्चित कर लें कि आप अपने फेरबदल डिस्क पर गिर जाएंगे (यह 1.0.0 के बाद से डिफ़ॉल्ट है)।
  • स्मृति लीक के लिए देखें, ये अकसर अकस्मात वस्तुओं को बंद करने के कारण होते हैं जिन्हें आपको अपने लम्ब्दास में आवश्यकता नहीं है। निदान करने का तरीका लॉग्स में "कार्य बाइट के रूप में क्रमबद्ध है" के लिए, यदि XXX बड़ा है या MB से कुछ अधिक है, तो आपके पास स्मृति रिसाव हो सकता है https://stackoverflow.com/a/25270600/1586965 देखें
  • ऊपर से संबंधित; प्रसारण चर का उपयोग करें यदि आप वास्तव में बड़े ऑब्जेक्ट की आवश्यकता करते हैं
  • यदि आप बड़े आरडीडी को कैशिंग कर रहे हैं और आरडीडी की धारावाहिका के बारे में सोचते हैं तो http://spark.apache.org/docs/latest/tuning.html#serialized-rdd-storage या उन्हें डिस्क पर कैशिंग भी कर सकते हैं (जो कभी-कभी SSDs का उपयोग करते समय बुरा नहीं होता है)।
  • ( उन्नत ) ऊपर से संबंधित, String और भारी नेस्टेड संरचनाओं (जैसे Map और नेस्टेड केस क्लासेस) से बचें। यदि संभव हो तो केवल आदिम प्रकारों का उपयोग करने की कोशिश करें और सभी गैर-प्राथमिकताओं का सूचक दें, खासकर यदि आप कई डुप्लिकेट की अपेक्षा करते हैं। जब भी संभव हो तो नेस्टेड संरचनाओं पर WrappedArray चुनें। या यहां तक ​​कि अपना खुद का सीरियलाइजेशन भी रोल करें – आपके डेटा को बाइट्स में कुशलतापूर्वक वापस कैसे करें , आईटी का इस्तेमाल करने के बारे में आपको सबसे अधिक जानकारी होगी!
  • ( बिट हैकी ) फिर से कैशिंग के दौरान, अपनी संरचना कैश करने के लिए Dataset का उपयोग करने पर विचार करें क्योंकि यह अधिक कुशल सीरियलाइजेशन का उपयोग करेगा। पिछले बुलेट बिंदु की तुलना में इसे एक हैक के रूप में माना जाना चाहिए। अपने डोमेन ज्ञान को अपने एल्गो / सीरियलाइजेशन में बनाकर स्मृति / कैश-स्पेस को 100x या 1000x तक कम कर सकते हैं, जबकि सभी Dataset की संभावना 2x – 5x स्मृति में और 10x डिस्क पर (लकड़ी की छत) संकुचित होती है।

http://spark.apache.org/docs/1.2.1/configuration.html

संपादित करें: (इसलिए मैं खुद को आसान कर सकता हूं) निम्न समस्या का भी संकेत मिलता है:

 java.lang.OutOfMemoryError : GC overhead limit exceeded 

उपयोग केस को उस पर जोड़ने के लिए जिसे अक्सर चर्चा नहीं की जाती है, Spark आवेदन को स्थानीय मोड में spark-submit माध्यम से प्रस्तुत करते समय मैं एक समाधान तैयार कर दूँगा।

जेसेक लस्कोस्की द्वारा गिटबुक मास्टरींग अपाचे स्पार्क के अनुसार:

आप स्थानीय मोड में स्पार्क चला सकते हैं। इस गैर-वितरित एकल- JVM परिनियोजन मोड में, स्पार्क एक ही जेवीएम में सभी निष्पादन घटकों – ड्राइवर, निष्पादक, बैकएंड, और मास्टर – को पैदा करता है। यह एकमात्र तरीका है जहां चालक को निष्पादन के लिए उपयोग किया जाता है।

इस प्रकार, यदि आप heap साथ OOM त्रुटियों का अनुभव कर रहे हैं, तो यह executor-memory बजाय driver-memory समायोजित करने के लिए पर्याप्त है

यहाँ एक उदाहरण है:

 spark-1.6.1/bin/spark-submit --class "MyClass" --driver-memory 12g --master local[*] target/scala-2.10/simple-project_2.10-1.0.jar 

स्टार्ट अप स्क्रिप्ट पर एक नज़र डालें कि एक जावा ढेर का आकार वहां सेट है, ऐसा लगता है कि आप स्पार्क कार्यकर्ता चलाने से पहले इसे सेट नहीं कर रहे हैं

 # Set SPARK_MEM if it isn't already set since we also use it for this process SPARK_MEM=${SPARK_MEM:-512m} export SPARK_MEM # Set JAVA_OPTS to be able to load native libraries and to set heap size JAVA_OPTS="$OUR_JAVA_OPTS" JAVA_OPTS="$JAVA_OPTS -Djava.library.path=$SPARK_LIBRARY_PATH" JAVA_OPTS="$JAVA_OPTS -Xms$SPARK_MEM -Xmx$SPARK_MEM" 

आप यहां लिपियों को परिनियोजित करने के लिए दस्तावेज पा सकते हैं।

आपको ड्राइवर मेमोरी में वृद्धि करना चाहिए आपके $ SPARK_HOME / conf फोल्डर में आपको फ़ाइल spark-defaults.conf डीफ़ॉल्ट.कॉन्फ़ को ढूंढना चाहिए, spark-defaults.conf spark.driver.memory 4000m । मेमोरी spark.driver.memory 4000m को अपने मास्टर पर मेमोरी के आधार पर सेट करना spark.driver.memory 4000m , मुझे लगता है। यही मेरे लिए इस मुद्दे को तय करता है और सब कुछ सुचारू रूप से चलता है

मेमोरी ढेर आकार (कम से कम स्पार्क-1.0.0) सेट करने के लिए स्थान conf / spark-env में है। संबंधित चर SPARK_EXECUTOR_MEMORY और SPARK_DRIVER_MEMORY अधिक दस्तावेज़ तैनाती मार्गदर्शिका में हैं

इसके अलावा, सभी दास नोडों पर विन्यास फाइल की प्रतिलिपि करना भूलना नहीं है।