概述
Hadoop jar
命令出现ClassNotFound
错误【updating…】
1. 背景
在eclipse
中写的java
程序,用于浏览hdfs
中某个路径下的文件及文件夹,然后打成jar包交个服务器运行,在运行的时候,报ClassNotfund
错。
2. 操作步骤
2.1 执行命令
hadoop jar example-three.jar HDFSFolderShow /data
意思是去浏览hdfs中的/data文件夹
2.2 程序报错
报错如下:
Exception in thread "main" java.lang.ClassNotFoundException: HDFSFolderShow
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
其中example-three.jar
就是笔者打包生成的jar文件。然后后面跟的HDFSFolderShow
就是该程序中的main
方法所在的类名。
3 报错原因
3.1
这里报错的原因就在于,笔者在新建java类的时候,新建了一个包名,但是在jar中并不识得这个包,只认识默认包名,所以导致出现找不到类的错误。只要在相应的类名前添加相应的包名即可。例如将本例中的命令Hadoop jar example-three.jar HDFSFolderShow /data
改为Hadoop jar exampler-jar shen.liu.folder.hdfs.HDFSFolderShow /data
即可。
4. 实战操作
上面的叙述给出了该问题的解决办法,但是没有给出一个实际的代码,笔者在此再次补充一下。
不过这里不再给出上述那个代码,而是新创建了一个java程序,具体代码如下:
4.1 代码
URLCat
类
package hadoopDefinitiveGuide.chapter_3;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class URLCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws MalformedURLException {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in,System.out,4096,false);
} catch (IOException e) {
e.printStackTrace();
}
IOUtils.closeStream(in);
}
}
这个类的主要作用是:查看某个文件的内容并输出到标准输出中。
static
代码块
其中的static{}
是用于加载一个流处理
Sets an application’s {@code URLStreamHandlerFactory}. This method can be called at most once in a given Java Virtual Machine. The URLStreamHandlerFactory instance is used to construct a stream protocol handler from a protocol name.
设置一个应用的URLStreamHandlerFactory
。这个方法是被jvm至多调用一次。URLStreamHandlerFactory
实例将被用于从一个协议名称构建一个流处理协议
InputStream
代表的是一个抽象输入类URL
Creates a {@code URL} object from the {@code String} representation.
从指定string 表示的路径中创建一个URL
对象.
copyBytes(....)
方法指的是将流从一处拷贝到另一处。这里是从标准输入拷贝到标准输出。
Copies from one stream to another.
4.2 执行结果
将这个程序放到hadoop
集群中运行,得到如下结果:
[root@server4 hadoop]# hadoop jar test.jar hadoopDefinitiveGuide.chapter_3.URLCat hdfs://192.168.211.4:9000/input/data.txt
hadoop is a good platform to analyze big data in disk.
spark is a perfet tool to deal with big data in RAM.
最后
以上就是聪明小白菜为你收集整理的使用Hadoop执行jar命令出现ClassNotFound错误的全部内容,希望文章能够帮你解决使用Hadoop执行jar命令出现ClassNotFound错误所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复