[HADOOP] Hadoop / Eclipse- "main"스레드 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / fs / FileSystem
HADOOPHadoop / Eclipse- "main"스레드 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / fs / FileSystem
Manning Publishing의 Chuck Lam이 Hadoop의 Action에서 PutMerge 프로그램을 실행하려고합니다. 꽤 간단해야하지만 실행하려고하는 데 많은 문제가 있었으며이 오류로 인해 이해할 수 없었습니다. 한편, 나는 문제없이 기본 단어 수 프로그램을 실행하고 있습니다. 나는 지금 이것에 약 3 일을 보냈습니다. 나는 이것에 대해 가능한 모든 연구를 해왔고 방금 길을 잃었습니다.
나중에 어떤 아이디어가 있습니까?
프로그램:
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
FileSystem local = FileSystem.getLocal(conf);
Path inputDir = new Path(args[0]);
Path hdfsFile = new Path(args[1]);
try{
FileStatus[] inputFiles = local.listStatus(inputDir);
FSDataOutputStream out = hdfs.create(hdfsFile);
for (int i=0; i<=inputFiles.length; i++){
System.out.println(inputFiles[i].getPath().getName());
FSDataInputStream in = local.open(inputFiles[i].getPath());
byte buffer[] = new byte[256];
int bytesRead = 0;
while( (bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
in.close();
}
out.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
Eclipse의 출력 오류 :
2015-04-09 19:45:48,321 WARN util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileSystem
at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1012)
at java.lang.ClassLoader.loadClass(ClassLoader.java:413)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:370)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2563)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2574)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169)
at PutMerge.main(PutMerge.java:16)
이클립스 소개 :
Eclipse IDE for Java Developers
Version: Luna Service Release 2 (4.4.2)
Build id: 20150219-0600
하둡 소개 :
Hadoop 2.6.0
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /usr/local/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar
자바 소개 :
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
내 컴퓨터 정보 :
Mac OSX 10.9.5
Java 빌드 경로-라이브러리의 외부 JAR :
해결법
-
==============================
1.Eclipse IDE에 대한 나의 경험 :
Eclipse IDE에 대한 나의 경험 :
우분투 설치의 기본 경로는 usr / hadoop / hadoop-2.7.1입니다 (CONF라고합시다). CONF / share / hadoop / common / lib와 CONF / share / hadoop / common에서 두 개의 jar 파일을 추가했습니다. 그리고 이것은 Java 코드입니다 (Hadoop in Action).
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class PutMerge { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); conf.set("fs.file.impl",org.apache.hadoop.fs.LocalFileSystem.class.getName()); org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(conf); FileSystem local = org.apache.hadoop.fs.FileSystem.getLocal(conf); Path inputDir = new Path(args[0]); Path hdfsFile = new Path(args[1]); try { FileStatus[] inputFiles = local.listStatus(inputDir); FSDataOutputStream out = hdfs.create(hdfsFile); for (int i=0; i<inputFiles.length; i++) { System.out.println(inputFiles[i].getPath().getName()); FSDataInputStream in = local.open(inputFiles[i].getPath()); byte buffer[] = new byte[256]; int bytesRead = 0; while( (bytesRead = in.read(buffer)) > 0) { out.write(buffer, 0, bytesRead); } in.close(); } out.close(); } catch (IOException e) { e.printStackTrace(); } } }
나를위한 해결책은이 코드에서 .jar 파일을 내보내는 것입니다. PutMerge 프로젝트를 마우스 오른쪽 버튼으로 클릭 한 다음 팝업 메뉴에서 내 보냅니다.
jar 파일을 home / hduser 디렉토리의 PutMerge 폴더에 저장했습니다.
input (경로 / home / hduser / input)이라는 다른 폴더에는 PutMerge 프로 시저에 대한 입력으로 세 개의 .txt 파일이 있습니다.
이제 터미널 세션에서 명령을 시작할 준비가되었습니다. hadoop jar /home/hduser/PutMerge/PutMerge.jar PutMerge / home / hduser / input output4 / all
/usr/hadoop/hadoop-2.7.1$ hdfs dfs -cat / output4 / all 명령
세 개의 단일 파일의 모든 텍스트가 포함됩니다.
-
==============================
2.이것을 코드에 넣으십시오.
이것을 코드에 넣으십시오.
구성 구성 = new Configuration (); configuration.set ( "fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName ()); configuration.set ( "fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName ());
-
==============================
3.maven 저장소에 손상된 JAR 파일이 포함되어있을 때이 문제가 발생했습니다. Java 프로젝트의 "Maven Dependencies"를 볼 때 hadoop-common-x.x.x.jar이 일식으로 존재하는 것을 볼 수 있듯이. 그러나 Eclipse에서 JAR 파일을 확장하고 org.apache.hadoop.fs.FSDataInputStream이라는 클래스를 선택하면 Eclipse가 "Invalid LOC header"와 같은 메시지를보고했습니다.
maven 저장소에 손상된 JAR 파일이 포함되어있을 때이 문제가 발생했습니다. Java 프로젝트의 "Maven Dependencies"를 볼 때 hadoop-common-x.x.x.jar이 일식으로 존재하는 것을 볼 수 있듯이. 그러나 Eclipse에서 JAR 파일을 확장하고 org.apache.hadoop.fs.FSDataInputStream이라는 클래스를 선택하면 Eclipse가 "Invalid LOC header"와 같은 메시지를보고했습니다.
로컬 메이븐 저장소에서 모든 파일을 삭제하고 mvn install을 다시 실행하면 문제가 해결되었습니다.
-
==============================
4.구성을 사용하여 디버깅을 위해 앱을 실행하는 경우 종속성이 있고 제공 할 범위를 언급 한 경우 제공된 범위에 종속성 포함 확인란이 선택되어 있는지 확인하십시오. 이 접근법을 따라 나를 위해 일했습니다.
구성을 사용하여 디버깅을 위해 앱을 실행하는 경우 종속성이 있고 제공 할 범위를 언급 한 경우 제공된 범위에 종속성 포함 확인란이 선택되어 있는지 확인하십시오. 이 접근법을 따라 나를 위해 일했습니다.
from https://stackoverflow.com/questions/29551179/hadoop-eclipse-exception-in-thread-main-java-lang-noclassdeffounderror-org by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브에서 외부 테이블에 파티션 만들기 (0) | 2019.09.14 |
---|---|
[HADOOP] 동일한 테이블의 다른 배열 열과 관련하여 Hive 정렬 배열 열 (0) | 2019.09.14 |
[HADOOP] 사용 중이거나 지금까지 생성 된 모든 하이브 데이터베이스를 나열하는 방법은 무엇입니까? (0) | 2019.09.14 |
[HADOOP] YARN에서 시작하는 H2O가 작동하지 않습니다 (0) | 2019.09.14 |
[HADOOP] hadoop 클러스터 / HDFS에 의해 인식 되려면 사용자가 모든 노드에 존재해야합니까? (0) | 2019.09.14 |