2012-05-22 14 views
5

मैं जिराफ इनक्यूबेटर (https://cwiki.apache.org/confluence/display/GIRAPH/Shortest+Paths+Example) से सबसे कम पथ उदाहरण चलाने की कोशिश कर रहा हूं। हालांकि giraph - * - dependencies.jar से उदाहरण निष्पादित करने के बजाय, मैंने अपना खुद का काम जार बनाया है। जैसा उदाहरण में प्रस्तुत किया तो मैं एक ही नौकरी बना लिया, तो मैं हो रही थीगिरफ सबसे छोटा पथ उदाहरण क्लास नॉटफाउंड अपवाद

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.Test$SimpleShortestPathsVertexInputFormat 

तब मैं भीतरी वर्गों (SimpleShortestPathsVertexInputFormat और SimpleShortestPathsVertexOutputFormat) फ़ाइलों को अलग करता है चले गए और उन्हें (SimpleShortestPathsVertexInputFormat_v2, SimpleShortestPathsVertexOutputFormat_v2) सिर्फ मामले में नाम दिया गया है; कक्षा स्थिर नहीं हैं। इसने SimpleShortestPathsVertexInputFormat_v2 के लिए क्लास के मुद्दों को हल नहीं किया है, हालांकि मुझे अभी भी SimpleShortestPathsVertexOutputFormat_v2 के लिए एक ही त्रुटि मिल रही है। नीचे मेरा स्टैक ट्रेस है।

INFO mapred.JobClient: Running job: job_201205221101_0003 
INFO mapred.JobClient: map 0% reduce 0% 
INFO mapred.JobClient: Task Id : attempt_201205221101_0003_m_000005_0, Status : FAILED 
    java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:898) 
      at org.apache.giraph.graph.BspUtils.getVertexOutputFormatClass(BspUtils.java:134) 
      at org.apache.giraph.bsp.BspOutputFormat.getOutputCommitter(BspOutputFormat.java:56) 
      at org.apache.hadoop.mapred.Task.initialize(Task.java:490) 
      at org.apache.hadoop.mapred.MapTask.run(MapTask.java:352) 
      at org.apache.hadoop.mapred.Child$4.run(Child.java:259) 
      at java.security.AccessController.doPrivileged(Native Method) 
      at javax.security.auth.Subject.doAs(Subject.java:415) 
      at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) 
      at org.apache.hadoop.mapred.Child.main(Child.java:253) 
    Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866) 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:890) 
      ... 9 more 

मैंने अपने नौकरी जार का निरीक्षण किया है और सभी वर्ग वहां हैं। इसके अलावा मैं एक छद्म वितरित मोड में हैडऑप 0.20.203 का उपयोग कर रहा हूं। जिस तरह से मैं अपना काम लॉन्च करता हूं वह नीचे प्रस्तुत किया जाता है।

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar /path/to/input /path/to/output 0 3 

इसके अलावा, मैं giraph के लिए HADOOP_CLASSPATH परिभाषित किया है - * - dependencies.jar। मैं बिना किसी समस्या के पेजरैंकबेंचमार्क उदाहरण चला सकता हूं (सीधे जिराफ - * - निर्भरता.जर से), और शॉर्ट्स पथ उदाहरण भी काम करता है (सीधे giraph - * - dependencies.jar से भी)। अन्य हडूप नौकरियां किसी समस्या के बिना काम करती हैं (कहीं मैंने परीक्षण करने के लिए पढ़ा है कि मेरा "क्लस्टर" सही तरीके से काम करता है)। क्या कोई भी इसी तरह की समस्या में आया है? किसी भी तरह की सहायता को आभार समझेंगे।


समाधान (खेद इस तरह यह पोस्ट करने के लिए, लेकिन मैं अधिक कुछ घंटों के लिए अपने ही सवाल का जवाब नहीं कर सकते हैं)

इस मुद्दे मैं अपने नौकरी जार जोड़ने के लिए किया था हल करने के लिए -लिब्बार्स (जहां बनाया गया है HADOOP_CLASSPATH में कोई परिवर्तन नहीं)। नौकरी लॉन्च करने का आदेश अब ऐसा दिखता है।

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar,/path/to/job.jar /path/to/input /path/to/output 0 3 

जारों की सूची को अल्पविराम से अलग किया जाना चाहिए। हालांकि इसने मेरी समस्या हल कर दी है। मैं अभी भी उत्सुक हूं कि मुझे अपना नौकरी जार "क्लासपाथ" पैरामीटर के रूप में क्यों पास करना है? क्या कोई मुझे समझा सकता है कि इसके पीछे तर्कसंगत क्या है? जैसा कि मैंने इसे अपने नौकरी जार का आह्वान करने के लिए अजीब (कम से कम कहने के लिए) पाया और फिर इसे "क्लासपाथ" जार के रूप में फिर से पास कर दिया। मैं स्पष्टीकरण के बारे में वास्तव में उत्सुक हूँ।

उत्तर

3

मुझे समस्या का एक वैकल्पिक प्रोग्रामेटिक समाधान मिला। हम निम्नलिखित तरीके से रन() विधि को संशोधित करने की जरूरत है -

... 
@Override 
public int run(String[] argArray) throws Exception { 
    Preconditions.checkArgument(argArray.length == 4, 
     "run: Must have 4 arguments <input path> <output path> " + 
     "<source vertex id> <# of workers>"); 

    GiraphJob job = new GiraphJob(getConf(), getClass().getName()); 
    // This is the addition - it will make hadoop look for other classes in the same  jar that contains this class 
    job.getInternalJob().setJarByClass(getClass()); 
    job.setVertexClass(getClass()); 
    ... 
} 

setJarByClass() एक ही जार उस वर्ग getClass() द्वारा दिया होता है में लापता कक्षाओं के लिए Hadoop देखो कर देगा, और हम करेंगे नौकरी जार नाम को अलग-अलग-लिब्जेर्स विकल्प में जोड़ने की आवश्यकता नहीं है।

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