使用Hadoop执行jar命令出现ClassNotFound错误

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即可。

=========== update on 2018-12-27=============
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说文科技

看书人不妨赏个酒钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值