복붙노트

[HADOOP] Hadoop 기본 'MapReduce 프로그램의 java.lang.NoClassDefFoundError

HADOOP

Hadoop 기본 'MapReduce 프로그램의 java.lang.NoClassDefFoundError

나는 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);
}
}

그러나 일식에서 달리기 후에. 오류가 발생했습니다.

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

해결법

  1. ==============================

    1.NoClassDefFoundError는 런타임에 클래스가 표시되지 않지만 컴파일 타임에 있었던 경우에 발생합니다. 모든 필수 클래스 파일이 포함되지 않았기 때문에 JAR 파일과 관련 될 수 있습니다.

    NoClassDefFoundError는 런타임에 클래스가 표시되지 않지만 컴파일 타임에 있었던 경우에 발생합니다. 모든 필수 클래스 파일이 포함되지 않았기 때문에 JAR 파일과 관련 될 수 있습니다.

    http://commons.apache.org/logging/download_logging.cgi에서 얻을 수있는 클래스 경로 commons-logging-1.1.1 jar를 추가하십시오.

  2. ==============================

    2.예외는 ClassNotFoundException 대신 NoClassDefFoundError입니다.

    예외는 ClassNotFoundException 대신 NoClassDefFoundError입니다.

    참고 : NoClassDefFoundError는 클래스가 런타임에 표시되지 않지만 컴파일 타임에 표시 될 때 throw됩니다. 이것은 JAR 파일의 배포 나 제작 과정에서 발생할 수있는 것으로, 필요한 모든 클래스 파일이 포함되어 있지는 않습니다.

    해결 방법 : 빌드 시간과 런타임 클래스 경로의 차이점을 확인하십시오.

    NoClassDefFoundError와 ClassNotFoundException은 다릅니다. 하나는 오류이고 다른 하나는 예외입니다.

    NoClassDefFoundError : 찾을 것으로 예상되는 클래스를 찾는 데 문제가있는 JVM에서 발생합니다. 클래스 파일이 없기 때문에 컴파일 타임에 작동하는 프로그램을 실행할 수 없습니다.

    ClassNotFoundException :이 예외는, 클래스가 클래스 패스상에서 발견되지 않았던, 즉 클래스 정의를로드하려고하고, 그 클래스를 포함한 클래스 / jar가 클래스 패스 내에 존재하지 않는 것을 나타냅니다.

  3. ==============================

    3.NoClassDefFoundError는 명명 된 클래스가 클래스 경로에 성공적으로있을 때 발생하지만 어떤 이유로로드 및 검증 할 수 없습니다. 대개 문제는 명명 된 클래스의 확인에 필요한 다른 클래스가 누락되었거나 잘못된 버전이라는 것입니다.

    NoClassDefFoundError는 명명 된 클래스가 클래스 경로에 성공적으로있을 때 발생하지만 어떤 이유로로드 및 검증 할 수 없습니다. 대개 문제는 명명 된 클래스의 확인에 필요한 다른 클래스가 누락되었거나 잘못된 버전이라는 것입니다.

    일반적으로이 오류는 클래스 패스에 올바른 버전의 모든 올바른 JAR 파일이 있는지 다시 확인해야합니다.

  4. ==============================

    4.로컬 IDE (Eclipse)에서 Hadoop Map / Reduce 프로그램을 실행하는 것은 매우 일반적인 오류입니다.

    로컬 IDE (Eclipse)에서 Hadoop Map / Reduce 프로그램을 실행하는 것은 매우 일반적인 오류입니다.

    빌드 경로에 이미 hadoop-core.jar을 추가 했으므로 프로그램에서 컴파일 오류가 감지되지 않습니다. 하지만 hadoop-core는 commons-logging.jar (다른 jar뿐만 아니라)에 의존하기 때문에 실행하면 오류가 발생합니다. / lib에있는 jar를 빌드 경로에 추가해야 할 수도 있습니다.

    Maven이나 다른 의존성 관리 도구를 사용하여 종속성을 관리하는 것이 좋습니다.

  5. ==============================

    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-bit /. Marven없이 Eclipse에서 종속성을 참조하는 방법을 설명합니다. 그러나 Marven은 제가 이해 한 것으로부터 선호되는 방법입니다.

    기사를 읽으십시오 : http://kishorer.in/2014/10/22/running-a-wordcount-mapreduce-example-in-hadoop-2-4-1-single-node-cluster-in-ubuntu-14 -04-64-bit /. Marven없이 Eclipse에서 종속성을 참조하는 방법을 설명합니다. 그러나 Marven은 제가 이해 한 것으로부터 선호되는 방법입니다.

  6. from https://stackoverflow.com/questions/13776795/java-lang-noclassdeffounderror-in-hadoop-basics-mapreduce-program by cc-by-sa and MIT license