2013-03-19 23 views
5

के लिए नया मूल धागा बनाने में असमर्थ मैं छोटे डेटासेट के लिए ठीक चल रहा है जो हाइव क्वेरी चला रहा है। लेकिन मैं 250 मिलियन रिकॉर्ड के लिए दौड़ रहा हूं, मुझेjava.lang.OutOfMemoryError: बड़े डेटा सेट

FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:640) 
    at org.apache.hadoop.mapred.Task$TaskReporter.startCommunicationThread(Task.java:725) 
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:362) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 



2013-03-18 14:12:58,907 WARN org.apache.hadoop.mapred.Child: Error running child 
java.io.IOException: Cannot run program "ln": java.io.IOException: error=11, Resource temporarily unavailable 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at java.lang.Runtime.exec(Runtime.java:593) 
    at java.lang.Runtime.exec(Runtime.java:431) 
    at java.lang.Runtime.exec(Runtime.java:369) 
    at org.apache.hadoop.fs.FileUtil.symLink(FileUtil.java:567) 
    at org.apache.hadoop.mapred.TaskRunner.symlink(TaskRunner.java:787) 
    at org.apache.hadoop.mapred.TaskRunner.setupWorkDir(TaskRunner.java:752) 
    at org.apache.hadoop.mapred.Child.main(Child.java:225) 
Caused by: java.io.IOException: java.io.IOException: error=11, Resource temporarily unavailable 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:65) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 
    ... 7 more 
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Task: Runnning cleanup for the task 
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Child: Error cleaning up 
    java.lang.NullPointerException 
    at org.apache.hadoop.mapred.Task.taskCleanup(Task.java:1048) 
    at org.apache.hadoop.mapred.Child.main(Child.java:281) 

पर सहायता की आवश्यकता है।

+0

मैंने यह देखा है कि आपके पास कार्य ट्रैकर नोड कार्य (नक्शा या कम) चलाने पर कोई और डिस्क स्थान नहीं है। आपका क्लस्टर कितना बड़ा है, और प्रत्येक क्लस्टर नोड (विभाजन पर जहां मैपर्ड स्टोर्स इसे अस्थायी फाइलों पर संग्रहीत करता है) पर उपलब्ध खाली स्थान क्या है –

उत्तर

-1

आपको धन्यवाद .. आप सही हैं। यह फाइल डिस्क्रिप्टर की वजह से है, क्योंकि मेरा प्रोग्राम लक्ष्य तालिका में बहुत सारी फाइलें उत्पन्न कर रहा था। विभाजन संरचना के बहुस्तरीय के कारण।

मैंने उलिमिट और xceivers संपत्ति भी बढ़ा दी है। इससे मदद मिली लेकिन फिर भी हमारी स्थिति में उन सीमाओं को

फिर हमने विभाजन के अनुसार डेटा वितरित करने का निर्णय लिया और फिर हमें प्रति विभाजन केवल एक फ़ाइल मिल रही है।

यह हमारे लिए काम करता है। हमने अपने सिस्टम को 50 + बिलियन रिकॉर्ड तक बढ़ा दिया और यह हमारे लिए काम किया

+0

हाय मुझे यह त्रुटि 'hive.log' में कई अपवादों के उप अपवाद के रूप में मिल रही है। क्या हमें 'ulimit' सेट करने के बाद hiveserver और/या मेटास्टोर चलाने वाली मशीन को पुनरारंभ करने की आवश्यकता है? – Mahesha999

+0

यह वास्तविक उत्तर की तुलना में एक टिप्पणी की तरह है। – raindev

1

यदि आपकी नौकरी नोड्स पर OutOfMemmory की वजह से विफल हो रही है तो आप अपने अधिकतम मानचित्र और reducers और प्रत्येक के लिए JVM विकल्प tweek कर सकते हैं। mapred.child.java.opts (डिफ़ॉल्ट 200Xmx है) आमतौर पर आपके डेटा नोड्स विशिष्ट हार्डवेयर के आधार पर बढ़ाना होगा।

7

मैंने सामान्य रूप से MapReduce के साथ इसका अनुभव किया है। मेरे अनुभव में यह वास्तव में आउट ऑफ़ मेमोरी त्रुटि नहीं है - सिस्टम थ्रेड शुरू करने के लिए फ़ाइल डिस्क्रिप्टर से बाहर चल रहा है, यही कारण है कि यह "नया मूल धागा बनाने में असमर्थ" कहता है।

हमारे लिए फिक्स (लिनक्स पर) उलिमिट को बढ़ाने के लिए था, जिसे 1024, 2048 से 2048 तक सेट किया गया था: ulimit -n 2048। आपको ऐसा करने की अनुमति होगी - या तो सूडो या रूट एक्सेस या 2048 या उससे अधिक की हार्ड सीमा है ताकि आप इसे सिस्टम पर अपने उपयोगकर्ता के रूप में सेट कर सकें। आप इसे अपने .profile या .bashrc सेटिंग्स फ़ाइल में कर सकते हैं।

आप ulimit -a के साथ अपनी वर्तमान सेटिंग्स देख सकते हैं। अधिक जानकारी के लिए यह संदर्भ देखें: https://stackoverflow.com/a/34645/871012

मैंने कई अन्य लोगों को /etc/security/limits.conf फ़ाइल को बदलने के बारे में भी बात की है, लेकिन मुझे अभी तक ऐसा नहीं करना है। यहां एक लिंक है जिसके बारे में बात कर रही है: https://stackoverflow.com/a/8285278/871012

संबंधित मुद्दे