복붙노트

[HADOOP] Hadoop / Eclipse- "main"스레드 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / fs / FileSystem

HADOOP

Hadoop / 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.구성을 사용하여 디버깅을 위해 앱을 실행하는 경우 종속성이 있고 제공 할 범위를 언급 한 경우 제공된 범위에 종속성 포함 확인란이 선택되어 있는지 확인하십시오. 이 접근법을 따라 나를 위해 일했습니다.

    구성을 사용하여 디버깅을 위해 앱을 실행하는 경우 종속성이 있고 제공 할 범위를 언급 한 경우 제공된 범위에 종속성 포함 확인란이 선택되어 있는지 확인하십시오. 이 접근법을 따라 나를 위해 일했습니다.

  5. from https://stackoverflow.com/questions/29551179/hadoop-eclipse-exception-in-thread-main-java-lang-noclassdeffounderror-org by cc-by-sa and MIT license