java.lang.NoClassDefFoundError在Hadoop的基础的MapReduce

2019-08-03 17:26发布

我想Hadoop的MapReduce的基本方案,其教程上http://java.dzone.com/articles/hadoop-basics-creating

类的完整代码是(该代码存在于净上面URL)

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.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Dictionary {
public static class WordMapper extends Mapper<Text, Text, Text, Text> {
    private Text word = new Text();

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

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

    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        String translations = "";
        for (Text val : values) {
            translations += "|" + val.toString();
        }
        result.set(translations);
        context.write(key, result);
    }
}

public static void main(String[] args) throws Exception {
    System.out.println("welcome to Java 1");
    Configuration conf = new Configuration();
    System.out.println("welcome to Java 2");
    Job job = new Job(conf, "dictionary");
    job.setJarByClass(Dictionary.class);
    job.setMapperClass(WordMapper.class);
    job.setReducerClass(AllTranslationsReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    FileInputFormat.addInputPath(job, new Path("/tmp/hadoop-cscarioni/dfs/name/file"));
    FileOutputFormat.setOutputPath(job, new Path("output"));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

但在Eclipse中运行后, 我发现了错误,

welcome to Java 1
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:73)
at Dictionary.main(Dictionary.java:43)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more

Answer 1:

NoClassDefFoundError的来当一类是在运行时不可见,但在编译的时候。 这可能与JAR文件,因为所有需要的类文件中不包括在内。

因此,尝试添加在你的类路径共享记录-1.1.1罐子,你可以从中获取http://commons.apache.org/logging/download_logging.cgi



Answer 2:

请注意,例外是NoClassDefFoundError的,而不是ClassNotFoundException异常。

:当一个类是在运行时不可见,但在编译的时候是可见的NoClassDefFoundError异常。 这可能是东西,可以在JAR文件中,并非所有必需的类文件被列入经销或生产发生。

要解决 :请检查您的构建时和运行时类路径的差异。

的NoClassDefFoundError和ClassNotFoundException的是不同的。 一个是一个错误,另一种是一个例外。

NoClassDefFoundError的 :源自于JVM有问题发现一类是希望能够找到。 这是在编译时工作不能因为类的运行程序文件不被发现。

ClassNotFoundException的 :此异常指示类不是在类路径中即存在于我们试图加载类的定义,并包含类在classpath中不存在的类/罐。



Answer 3:

NoClassDefFoundError的时候命名类成功位于classpath中出现,但由于某种原因无法加载和验证。 最常见的问题是,需要命名类的验证另一个类是丢失或错误的版本。

一般来说,这个错误的意思是“仔细检查你在你的classpath中有所有正确的JAR文件(正确版本)”。



Answer 4:

当你运行一个Hadoop地图这是一个非常常见的错误/减少当地的IDE(Eclipse的)计划。

你应该已经加入Hadoop的core.jar添加在您的构建路径,所以在程序中没有检测到编译错误。 但是,当你运行它,因为Hadoop的核心是依赖于公共-logging.jar(以及一些其他的罐子)你的错误。 您可能需要/ lib下的jar文件添加到您的构建路径。

我建议你使用Maven或其他依赖管理工具来管理依赖。



Answer 5:

请阅读文章: http://kishorer.in/2014/10/22/running-a-wordcount-mapreduce-example-in-hadoop-2-4-1-single-node-cluster-in-ubuntu-14 -04-64位/ 。 它说明了如何引用依赖在Eclipse中没有马文。 然而,马文是首选的方式,从我的理解。



文章来源: java.lang.NoClassDefFoundError in Hadoop Basics' MapReduce Program