[HADOOP] Hadoop 기본 'MapReduce 프로그램의 java.lang.NoClassDefFoundError
HADOOPHadoop 기본 '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.NoClassDefFoundError는 런타임에 클래스가 표시되지 않지만 컴파일 타임에 있었던 경우에 발생합니다. 모든 필수 클래스 파일이 포함되지 않았기 때문에 JAR 파일과 관련 될 수 있습니다.
NoClassDefFoundError는 런타임에 클래스가 표시되지 않지만 컴파일 타임에 있었던 경우에 발생합니다. 모든 필수 클래스 파일이 포함되지 않았기 때문에 JAR 파일과 관련 될 수 있습니다.
http://commons.apache.org/logging/download_logging.cgi에서 얻을 수있는 클래스 경로 commons-logging-1.1.1 jar를 추가하십시오.
-
==============================
2.예외는 ClassNotFoundException 대신 NoClassDefFoundError입니다.
예외는 ClassNotFoundException 대신 NoClassDefFoundError입니다.
참고 : NoClassDefFoundError는 클래스가 런타임에 표시되지 않지만 컴파일 타임에 표시 될 때 throw됩니다. 이것은 JAR 파일의 배포 나 제작 과정에서 발생할 수있는 것으로, 필요한 모든 클래스 파일이 포함되어 있지는 않습니다.
해결 방법 : 빌드 시간과 런타임 클래스 경로의 차이점을 확인하십시오.
NoClassDefFoundError와 ClassNotFoundException은 다릅니다. 하나는 오류이고 다른 하나는 예외입니다.
NoClassDefFoundError : 찾을 것으로 예상되는 클래스를 찾는 데 문제가있는 JVM에서 발생합니다. 클래스 파일이 없기 때문에 컴파일 타임에 작동하는 프로그램을 실행할 수 없습니다.
ClassNotFoundException :이 예외는, 클래스가 클래스 패스상에서 발견되지 않았던, 즉 클래스 정의를로드하려고하고, 그 클래스를 포함한 클래스 / jar가 클래스 패스 내에 존재하지 않는 것을 나타냅니다.
-
==============================
3.NoClassDefFoundError는 명명 된 클래스가 클래스 경로에 성공적으로있을 때 발생하지만 어떤 이유로로드 및 검증 할 수 없습니다. 대개 문제는 명명 된 클래스의 확인에 필요한 다른 클래스가 누락되었거나 잘못된 버전이라는 것입니다.
NoClassDefFoundError는 명명 된 클래스가 클래스 경로에 성공적으로있을 때 발생하지만 어떤 이유로로드 및 검증 할 수 없습니다. 대개 문제는 명명 된 클래스의 확인에 필요한 다른 클래스가 누락되었거나 잘못된 버전이라는 것입니다.
일반적으로이 오류는 클래스 패스에 올바른 버전의 모든 올바른 JAR 파일이 있는지 다시 확인해야합니다.
-
==============================
4.로컬 IDE (Eclipse)에서 Hadoop Map / Reduce 프로그램을 실행하는 것은 매우 일반적인 오류입니다.
로컬 IDE (Eclipse)에서 Hadoop Map / Reduce 프로그램을 실행하는 것은 매우 일반적인 오류입니다.
빌드 경로에 이미 hadoop-core.jar을 추가 했으므로 프로그램에서 컴파일 오류가 감지되지 않습니다. 하지만 hadoop-core는 commons-logging.jar (다른 jar뿐만 아니라)에 의존하기 때문에 실행하면 오류가 발생합니다. / lib에있는 jar를 빌드 경로에 추가해야 할 수도 있습니다.
Maven이나 다른 의존성 관리 도구를 사용하여 종속성을 관리하는 것이 좋습니다.
-
==============================
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은 제가 이해 한 것으로부터 선호되는 방법입니다.
from https://stackoverflow.com/questions/13776795/java-lang-noclassdeffounderror-in-hadoop-basics-mapreduce-program by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 돼지 결과를 로컬 파일에 저장 (0) | 2019.07.29 |
---|---|
[HADOOP] Mapreduce 오류 : 로컬 디렉토리를 설정하지 못했습니다. (0) | 2019.07.29 |
[HADOOP] Hadoop과 돼지 관계 설정하기 (0) | 2019.07.29 |
[HADOOP] 원사 : 전체 클러스터 리소스를 활용하는 방법? (0) | 2019.07.29 |
[HADOOP] Hadoop에서 Snappy를 컨테이너 형식으로 사용하는 방법 (0) | 2019.07.29 |