java.lang.OutOfMemory Hadoop नौकरी चलाने पर त्रुटि

मेरे पास एक इनपुट फ़ाइल (~ 31 जीबी आकार) है जिसमें उपभोक्ता समीक्षा कुछ उत्पादों के बारे में है, जिन्हें मैं लेमैमैटिज़ करने और संबंधित लेम्मा गिनती खोजने की कोशिश कर रहा हूं। दृष्टिकोण कुछ हद तक हडोप के साथ प्रदान किए गए वर्डकाउंट उदाहरण के समान है। मेरे पास प्रोसेसिंग करने के लिए सभी में 4 कक्षाएं हैं: स्टैनफोर्ड लेमैटाइज़र [स्टैनफोर्ड के कोरएनएलपी पैकेज v3.3.0], वर्डकाउंट [ड्राइवर], वर्डकाउंटमैपर [मैपर], और वर्डकाउंट रेड्यूसर [रेड्यूसर] से लेमैमैटिंग के लिए उपहार शामिल हैं।

मैंने मूल डेटासेट के सबसेट (एमबी में) पर प्रोग्राम का परीक्षण किया है और यह ठीक चलता है। दुर्भाग्यवश, जब मैं आकार ~ 31 जीबी के पूर्ण डेटासेट पर नौकरी चलाता हूं, तो नौकरी विफल हो जाती है। मैंने नौकरी के लिए syslog की जांच की और इसमें यह शामिल था:

java.lang.OutOfMemoryError: जावा हीप स्पेस पर   edu.stanford.nlp.sequences.ExactBestSequenceFinder.bestSequence (ExactBestSequenceFinder.java:109)   [...]

इसे संभालने के तरीके पर कोई सुझाव?

Note: I'm using the Yahoo's VM which comes pre-configured with hadoop-0.18.0. I've also tried the solution of assigning more heap as mentioned in this thread: out of Memory Error in Hadoop

WordCountMapper कोड:

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;

public class WordCountMapper extends MapReduceBase
    implements Mapper {

  private final IntWritable one = new IntWritable(1);
  private final Text word = new Text();
  private final StanfordLemmatizer slem = new StanfordLemmatizer();

  public void map(LongWritable key, Text value,
      OutputCollector output, Reporter reporter) throws IOException {

    String line = value.toString();

    if(line.matches("^review/(summary|text).*"))    //if the current line represents a summary/text of a review, process it! 
    {
        for(String lemma: slem.lemmatize(line.replaceAll("^review/(summary|text):.", "").toLowerCase()))
        {
            word.set(lemma);
            output.collect(word, one);
        }
    }
  }
}
0

2 उत्तर

आपको उन व्यक्तिगत इकाइयों का आकार बनाना होगा जिन्हें आप संसाधित कर रहे हैं (यानी, नक्शा-कम में प्रत्येक मानचित्र नौकरी) उचित। पहली इकाई दस्तावेज़ का आकार है जिसे आप स्टैनफोर्डकोर एनएलपी की एनोटेट() कॉल पर प्रदान कर रहे हैं। आपके द्वारा प्रदान किए जाने वाले पाठ का पूरा टुकड़ा स्मृति में टोकन और संसाधित किया जाएगा। टोकनयुक्त और संसाधित रूप में, यह डिस्क पर इसके आकार की तुलना में बड़ा आयाम के क्रम में है। तो, दस्तावेज़ आकार उचित होना चाहिए। उदा।, आप एक समय में एक उपभोक्ता समीक्षा में गुजर सकते हैं (और 31 जीबी फ़ाइल की पाठ नहीं!)

दूसरा, एक स्तर नीचे, पीओएस टैगर (जो लेमैमैटिज़ेशन से पहले) एक समय में एक वाक्य की व्याख्या कर रहा है, और यह वाक्य को टैग करने के लिए बड़े अस्थायी गतिशील प्रोग्रामिंग डेटा संरचनाओं का उपयोग करता है, जो वाक्यों की तुलना में आकार में बड़े पैमाने पर 3 ऑर्डर हो सकता है । इसलिए, व्यक्तिगत वाक्यों की लंबाई भी उचित होने की आवश्यकता है। यदि टेक्स्ट या जंक का लंबा हिस्सा होता है जो वाक्यों में विभाजित नहीं होता है, तो आपको इस स्तर पर भी समस्या हो सकती है। इसे ठीक करने का एक आसान तरीका pos.maxlen प्रॉपर्टी का उपयोग करना है ताकि पीओएस टैगिंग सुपर लम्बी वाक्यों से बच सकें।

अनुलेख और निश्चित रूप से आपको पार्स, डकोरफ़ जैसे एनोटेटर्स नहीं चलाएंगे जिन्हें आप उपयोग नहीं कर रहे हैं, अगर आपको केवल लेमैमाइज़र की आवश्यकता है।

2
जोड़ा
विस्तृत स्पष्टीकरण और सुझावों के लिए धन्यवाद प्रोफेसर मैनिंग। उन्हें आज़माएं और देखें कि क्या मैं कुछ कामकाज का प्रबंधन कर सकता हूं :)
जोड़ा लेखक Aditya, स्रोत

हैडूप हेप स्पेस को कॉन्फ़िगर करने से आपकी मदद नहीं हो सकती है यदि आपका स्टैनफोर्ड लेमैमाइज़र मैप्रिडस जॉब का हिस्सा नहीं है। क्या आप नौकरी का कोड प्रदान कर सकते हैं? इसलिए, मेरा मानना ​​है कि सामान्य रूप से आप जावा हेप स्पेस की सीमाएं हैं।

इसे कॉन्फ़िगर करने पर विचार करने से पहले इसे पहले जांचें:

मैंने edu.stanford.nlp.sequences.ExactBestSequenceFinder के कोड पर एक नज़र डाली थी (आपको यह भी कोशिश करनी चाहिए यहां )

मुझे नहीं पता कि stanford.nlp का कौन सा संस्करण आप उपयोग करते हैं और मैं इससे परिचित नहीं हूं लेकिन ऐसा लगता है कि आप इनपुट के रूप में "अनुक्रम मॉडल" के आधार पर कुछ संचालन करते हैं। यह इस तरह से शुरू होता है:

private int[] bestSequenceNew(SequenceModel ts) {
   //Set up tag options
    int length = ts.length();
    int leftWindow = ts.leftWindow();
    int rightWindow = ts.rightWindow();
    int padLength = length + leftWindow + rightWindow;
    int[][] tags = new int[padLength][];  //operations based on the length of ts
    int[] tagNum = new int[padLength];   //this is the guilty line 109 according to grepcode

तो आउटपुट     ts.length () बहुत बड़ा है (या इस सरणी के लिए जावा हेप स्पेस नहीं है)। क्या आप इसे छोटा कर सकते हैं?

Edit

तो जाहिर है स्ट्रिंग

 line.replaceAll("^review/(summary|text):.", "").toLowerCase()

जावा ढेर के लिए बहुत अधिक है। क्या आप जांच सकते हैं कि यह वास्तव में आप चाहते हैं? क्या आप इसकी लंबाई प्रिंट कर सकते हैं? हो सकता है कि आपको अपने 31 जीबी डेटासेट को पुनर्गठित करने पर विचार करना चाहिए ताकि आपके काम के लिए अब से अधिक छोटी लाइनें हों (यदि यह संभव है)। यह हो सकता है कि गलती और समस्या का कारण एक पंक्ति बहुत बड़ी है।

यदि यह नहीं किया जा सकता है, तो कृपया अपवादों के पूर्ण स्टैक ट्रेस को प्रिंट करें।

0
जोड़ा
धन्यवाद आर्टम, मैं स्टैनफोर्ड कोरएनएलपी पैकेज के v3.3.0 का उपयोग कर रहा हूं। यदि आप एक नज़र रखना चाहते हैं तो बस प्रश्न में अपने मैपर वर्ग का कोड जोड़ा गया। कोरएनएलपी के स्रोत कोड के साथ झुकाव करने की बजाय, मैं अपने स्वयं के कार्यक्रम को ट्वीव करना पसंद करूंगा क्योंकि यह मेरे लिए बहुत कम जटिल होगा :)
जोड़ा लेखक Aditya, स्रोत
धन्यवाद आर्टम, जो सही समझ में आता है। मैं कोशिश करता हूं और देख सकता हूं कि क्या मैं हैडोप द्वारा निष्पादन के लिए इसे पास करने से पहले डेटासेट को प्री-प्रोसेस कर सकता हूं। मैंने उस समय एक और कामकाज खोजने की कोशिश की है, लेकिन कोई भाग्य नहीं है। चूंकि मुझे लगा कि यह एक अलग सवाल था, मैंने इसे यहां पूछा है यदि आप एक नज़र रखना चाहते हैं: stackoverflow.com/questions/20256197/use-wget-with-hadoop
जोड़ा लेखक Aditya, स्रोत
@ आदित्य आपका स्वागत है! कृपया संपादन देखें।
जोड़ा लेखक Artem Tsikiridis, स्रोत
@ आदित्य आप फिर से स्वागत करते हैं :) अगर आपको लगता है कि मेरा जवाब आपकी समस्या का समाधान है तो क्या आप इसे स्वीकार कर सकते हैं? ठीक है, मैं एक नज़र डालूँगा। खुश होती है।
जोड़ा लेखक Artem Tsikiridis, स्रोत