2014-11-02 7 views
7

मैं Hadoop के लिए नया हूँ। मैंने एकल नोड में हडूप स्थापित करने के लिए मैशेल-नोल ट्यूटोरियल का पालन किया। मैंने वर्डकाउंट प्रोग्राम चलाने की कोशिश की। यह वह कोड है जिसका मैंने उपयोग किया था:Hadoop जावा त्रुटि: सूत्र में अपवाद "मुख्य" java.lang.NoClassDefFoundError: शब्दसंख्या (गलत नाम: ऑर्ग/myorg/शब्दसंख्या)

import java.io.IOException; 
import java.util.StringTokenizer; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class WordCount { 

    public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable>{ 

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

    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()) { 
     word.set(itr.nextToken()); 
     context.write(word, one); 
     } 
    } 
    } 

    public static class IntSumReducer 
     extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
         Context context 
         ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
     sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    Job job = Job.getInstance(conf, "WordCount"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 

यह तब होता है जब मैं इसे चलाने का प्रयास करता हूं।

[email protected]:/usr/local/hadoop$ bin/hadoop jar wc.jar WordCount /home/hduser/gutenberg /home/hduser/gutenberg-output/sample.txt 
Exception in thread "main" java.lang.NoClassDefFoundError: WordCount (wrong name: org/myorg/WordCount) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:788) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:447) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:411) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:270) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:205) 

क्या कोई मेरी मदद कर सकता है। मेरी कक्षा पथ:

[email protected]:/usr/local/hadoop$ hadoop classpath 
/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/lib/jvm/java-7-openjdk-i386/lib/tools.jar:/usr/local/hadoop/contrib/capacity-scheduler/*.jar 
+0

आप ड्राइवर वर्ग गायब हैं (हालांकि आप इसे रेड्यूसर के साथ जोड़ते हैं जो खराब अभ्यास है)। क्या आपके पास अपने कक्षा में यह जार है? – SMA

+0

प्रश्न में कक्षा पथ जोड़ा है। क्या मुझे उपरोक्त फ़ोल्डर में से एक में जार फ़ाइल रखना चाहिए। –

+0

इसे उसी निर्देशिका में रखें जहां से आप अपना मानचित्र चला रहे हैं या इसे lib निर्देशिका में रखें जहां hadoop libs बैठता है। – SMA

उत्तर

3

इस कोशिश,

import java.io.IOException; 
import java.util.Iterator; 
import java.util.StringTokenizer; 

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 
import org.apache.hadoop.mapred.TextInputFormat; 
import org.apache.hadoop.mapred.TextOutputFormat; 

public class WordCount { 

    public static class Map extends MapReduceBase implements 
      Mapper<LongWritable, Text, Text, IntWritable> { 

     @Override 
     public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) 
       throws IOException { 

      String line = value.toString(); 
      StringTokenizer tokenizer = new StringTokenizer(line); 

      while (tokenizer.hasMoreTokens()) { 
       value.set(tokenizer.nextToken()); 
       output.collect(value, new IntWritable(1)); 
      } 

     } 
    } 

    public static class Reduce extends MapReduceBase implements 
      Reducer<Text, IntWritable, Text, IntWritable> { 

     @Override 
     public void reduce(Text key, Iterator<IntWritable> values, 
       OutputCollector<Text, IntWritable> output, Reporter reporter) 
       throws IOException { 
      int sum = 0; 
      while (values.hasNext()) { 
       sum += values.next().get(); 
      } 

      output.collect(key, new IntWritable(sum)); 
     } 
    } 

    public static void main(String[] args) throws Exception { 

     JobConf conf = new JobConf(WordCount.class); 
     conf.setJobName("wordcount"); 

     conf.setOutputKeyClass(Text.class); 
     conf.setOutputValueClass(IntWritable.class); 

     conf.setMapperClass(Map.class); 
     conf.setReducerClass(Reduce.class); 

     conf.setInputFormat(TextInputFormat.class); 
     conf.setOutputFormat(TextOutputFormat.class); 

     FileInputFormat.setInputPaths(conf, new Path(args[0])); 
     FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

     JobClient.runJob(conf); 

    } 
} 

तो आदेश चला

bin/hadoop jar WordCount.jar WordCount /hdfs_Input_filename /output_filename 

होना चाहिए, अगर अपने कोड विशेष पैकेज में है, तो आप वर्ग के नाम

साथ पैकेज नाम का उल्लेख करने के लिए है
bin/hadoop jar WordCount.jar PakageName.WordCount /hdfs_Input_filename /output_filename 
+3

मुझे वही कक्षा क्लास त्रुटि मिली है। बीटीडब्ल्यू, इस तरह मैं संकलन और जार बनाते हैं। क्या यह संस्कार है: $ bin/hadoop com.sun.tools.javac.Main WordCount.java $ jar cf wc.jar वर्डकाउंट * .class –

+0

आपके कोड में क्या समस्या है, आपका प्रोग्राम विशेष पैकेज में है या ग्रहण में डिफ़ॉल्ट पैकेज में है ??? –

+0

बस मेरे समाधान को देखो। मुझे इसकी पागल पता है: डी। बहुत बहुत धन्यवाद। मैंने वास्तव में आपका कोड इस्तेमाल किया। :) –

0

आप अपने वर्ग में पैकेज का उपयोग कर रहे हैं। तो अपने आदेश

bin/hadoop jar wc.jar org.myorg.WordCount /home/hduser/gutenberg /home/hduser/gutenberg-output/sample.txt 
+0

मुझे कक्षा को अपवाद नहीं मिला है। धागे "मुख्य" java.lang.ClassNotFoundException में अपवाद: org.myorg.WordCount –

0

इस मा वाई पागल लग रहा है। मैंने अपने कोड में package org.myorg; जोड़ा और इसे फिर से संकलित किया। मैंने क्लास फ़ाइलों को संगठन/myorg फ़ोल्डर में रखा और उन्हें उपयोग करके जार फ़ाइल बनाई। तब मैंने jar wc.jar org.myorg.WordCount कमांड का उपयोग करके भाग लिया और इसे सफलतापूर्वक निष्पादित कर दिया गया। यह अच्छा होगा अगर कोई मुझे समझा सके कि यह वास्तव में कैसे चला गया: डी। किसी भी तरह, मुझे लोगों की मदद करने के लिए बहुत बहुत धन्यवाद।

0

मैं आप एक गलती यहाँ बनाया लगता है:

/usr/local/hadoop$ bin/hadoop jar wc.jar org.myorg.WordCount /home/hduser/gutenberg /home/hduser/gutenberg-output/sample.txt 

कि काम करना चाहिए:

/usr/local/hadoop$ bin/hadoop jar wc.jar WordCount /home/hduser/gutenberg /home/hduser/gutenberg-output/sample.txt 

कृपया इसे करने के लिए बदल जाते हैं।

@Aswin Alagappan : कारण एक जार फ़ाइल उस में अपना रास्ता cotains है। जेवीएम आपकी कक्षा को जार फ़ाइल में नहीं ढूंढ सकता क्योंकि यह "जार \ org \ myorg" पथ में है। समझना?

0

आपके जार फ़ाइल में नेस्टेड कक्षाओं (यानी TokenizerMapper और IntSumReducer) को स्पष्ट रूप से शामिल करने का प्रयास करें। यहां बताया गया है कि मैंने यह कैसे किया:

jar cvf WordCount.jar WordCount.class WordCount\$TokenizerMapper.class WordCount\$IntSumReducer.class 
संबंधित मुद्दे