簡體   English   中英

Hadoop / Eclipse - 線程“main”中的異常java.lang.NoClassDefFoundError:org / apache / hadoop / fs / FileSystem

[英]Hadoop/Eclipse - Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileSystem

我正試圖從Manning Publishing的Chuck Lam手中的Hadoop in Action中運行PutMerge程序。 它應該很簡單,但是我嘗試運行它時遇到了一些問題,而且我已經遇到了這個我無法弄清楚的錯誤。 與此同時,我正在運行一個基本的wordcount程序沒有問題。 我現在花了大約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:

Eclipse IDE for Java Developers
Version: Luna Service Release 2 (4.4.2)
Build id: 20150219-0600

Eclipse安裝細節

關於Hadooop:

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:

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:

Hadoop常見

我使用Eclipse IDE的經驗: 從Package Explorer

我的ubuntu安裝的基本路徑是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項目,然后導出(從彈出菜單):

始終從Package Explorer

並將jar文件保存在home / hduser目錄下名為PutMerge的文件夾中 來自filesystem,PutMerge.jar

在另一個名為input(path / home / hduser / input)的文件夾中,有三個.txt文件作為PutMerge過程的輸入: 三個輸入文件

現在我們准備從終端會話啟動命令:hadoop jar /home/hduser/PutMerge/PutMerge.jar PutMerge / home / hduser / input output4 / all

和/usr/hadoop/hadoop-2.7.1$命令hdfs dfs -cat / output4 / all

將包含三個單個文件的所有文本。

在你的代碼中這樣寫

配置配置= 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());

當我的maven存儲庫包含損壞的JAR文件時,我遇到了這個問題。 和我一樣,在查看我的Java項目的“Maven Dependencies”時,我可以看到eclipse中存在hadoop-common-xxxjar。 但是,當在eclipse中擴展JAR文件並選擇名為org.apache.hadoop.fs.FSDataInputStream的類時,eclipse報告的消息類似於“Invalid LOC header”。

從我的本地maven存儲庫中刪除所有文件並再次執行mvn install解決了我的問題

如果您使用配置來運行應用程序以進行調試。 如果您有任何依賴項並且已經提到了它的范圍,請確保選中“ 包含依賴項與提供的范圍 ”復選框。 按照這種方法,它對我有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM