Hadoop/Eclipse-线程中的异常;“主要”;java.lang.NoClassDefFoundError:org/apache/hadoop/fs/FileSystem

Hadoop/Eclipse-线程中的异常;“主要”;java.lang.NoClassDefFoundError:org/apache/hadoop/fs/FileSystem,java,eclipse,hadoop,hdfs,Java,Eclipse,Hadoop,Hdfs,我正在尝试运行Hadoop中的PutMerge程序,由Manning Publishing的Chuck Lam编写。它应该很简单,但是我在运行它的时候遇到了很多问题,我遇到了一个我无法理解的错误。同时,我正在运行一个基本的字数计算程序,没有问题。我已经花了大约三天的时间在这上面了。我已经做了所有我能做的研究,我只是迷路了 你有什么想法吗 节目: import java.io.IOException; import org.apache.hadoop.conf.Configuration; im

我正在尝试运行Hadoop中的PutMerge程序,由Manning Publishing的Chuck Lam编写。它应该很简单,但是我在运行它的时候遇到了很多问题,我遇到了一个我无法理解的错误。同时,我正在运行一个基本的字数计算程序,没有问题。我已经花了大约三天的时间在这上面了。我已经做了所有我能做的研究,我只是迷路了

你有什么想法吗

节目:

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();

        }

    }

}

关于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:


在代码中这样写

配置=新配置(); set(“fs.hdfs.impl”,org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
set(“fs.file.impl”,org.apache.hadoop.fs.LocalFileSystem.class.getName())

当我的maven存储库包含损坏的JAR文件时,我遇到了这个问题。与您一样,在查看Java项目的“Maven依赖项”时,我可以看到eclipse中存在hadoop-common-x.x.x.jar。然而,当在eclipse中扩展JAR文件并选择名为
org.apache.hadoop.fs.FSDataInputStream的类时,eclipse报告了一条类似“Invalid LOC header”的消息


从本地maven存储库中删除所有文件并再次执行
mvn安装
解决了我的问题

如果您正在使用配置运行应用程序进行调试。如果您有任何依赖项并且提到了要提供的范围,请确保选中了包含具有提供范围的依赖项的复选框。
它通过以下方法对我有效

我使用Eclipse IDE的经验:

我安装ubuntu的基本路径是usr/hadoop/hadoop-2.7.1(比如CONF) 我添加了两个jar文件,分别来自CONF/share/hadoop/common/lib和CONF/share/hadoop/common。 这是java代码(摘自Hadoop in Action一书):

import java.io.IOException;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.FSDataInputStream;
导入org.apache.hadoop.fs.FSDataOutputStream;
导入org.apache.hadoop.fs.FileStatus;
导入org.apache.hadoop.fs.FileSystem;
导入org.apache.hadoop.fs.Path;
公共类合并{
公共静态void main(字符串[]args)引发IOException{
Configuration conf=新配置();
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);
路径inputDir=新路径(args[0]);
路径hdfsFile=新路径(args[1]);
试一试{
FileStatus[]inputFiles=local.listStatus(inputDir);
FSDataOutputStream out=hdfs.create(hdfsFile);
对于(int i=0;i 0){
out.write(缓冲区,0,字节读取);
}
in.close();
}
out.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
我的解决方案是从这段代码中导出.jar文件,我就是这么做的: 右键单击PutMerge项目,然后导出(从弹出菜单):

并将jar文件保存在home/hduser目录下名为PutMerge的文件夹中

在另一个名为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


将包含三个单独文件的所有文本。

它是maven项目吗??您是如何管理依赖关系的?异常为
NoClassDefFoundError
,表示肯定缺少依赖项。共享我们的依赖关系管理信息以帮助您..您是否在项目库中添加了
hadoop-common-2.6.0.jar
文件?如果没有,请在项目上单击鼠标右键-->属性-->Java构建路径-->库-->单击添加外部jar
并从
/usr/local/hadoop-2.6.0/share/hadoop/common/
文件夹中添加
hadoop-common-2.6.0.jar
,谢谢您花时间帮助我。我已经添加了一个外部JAR的屏幕截图,我已经添加到了上述问题的Java构建路径中。正如您所看到的,“hadoop-common-2.6.0.jar”就在这里。乔达里先生,您好,这不是一个Maven项目。我已经安装了Maven,但我不必将它用于我一直在做的其他程序,我没有遇到任何问题。至于其他依赖项,老实说,我不完全知道这意味着什么,但除了下载和安装hadoop、编辑必要的文件使其伪分发和尝试运行一些程序之外,我还没有做任何事情。
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
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();
        }
    }
}