操作java上传文件时,报错
问题描述:
操作java上传文件时,报下面的错误。hadoop集群有启动。老师帮忙看下是什么原因导致的,找不出来呀
相关代码:
java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more Error: A JNI error has occurred, please check your installation and try again Exception in thread "main"
相关代码:
package com.imooc.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class HdfsOp {
public static void main(String[] args) throws IOException {
System.out.println("haha");
//创建一个配置对象
Configuration configuration=new Configuration();
//指定HDFS的地址
configuration.set("fs.defaultFS","hdfs://bigdata01:9000");
//获取操作HDFS的对象
FileSystem fileSystem=FileSystem.get(configuration);
put(fileSystem);
// get(fileSystem);
// delete(fileSystem);
}
/**
* 删除文件
* @param fileSystem
* @throws IOException
*/
private static void delete(FileSystem fileSystem) throws IOException {
boolean flag = fileSystem.delete(new Path("/user.txt"), true);
if (flag){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
/**
* 下载文件
* @param fileSystem
* @throws IOException
*/
private static void get(FileSystem fileSystem) throws IOException {
//获取HDFS文件系统的输入流
FSDataInputStream fis = fileSystem.open(new Path("/README.txt"));
//获取本地文件的输出流
FileOutputStream fos = new FileOutputStream("D:\\README.txt");
IOUtils.copyBytes(fis,fos,1024,true);
}
/**
* 上传文件
* @param fileSystem
* @throws IOException
*/
private static void put(FileSystem fileSystem) throws IOException {
//获取HDFS文件系统的输出流
FSDataOutputStream fos = fileSystem.create(new Path("/user.txt"));
//获取本地文件的输入流
FileInputStream fis = new FileInputStream("D:\\user.txt");
//上传文件:通过工具类把输入流拷贝到输出流里面,实现本地上传文件
IOUtils.copyBytes(fis,fos,1024,true);
}
}22
收起
正在回答 回答被采纳积分+1
2回答
徐老师
2022-09-07 17:24:31
这个问题目前发现有两位同学都是因为忘记注释pom.xml中依赖中的scope参数导致的。
一定要注意确认一下这块:
下面这个依赖中的scope配置表示只在编译的时候使用,所以执行的时候还是找不到这个依赖。
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.0</version> <scope>provided</scope> </dependency>
解决办法就是把下面这一行内容注释掉,或者删掉。
<scope>provided</scope>
其实遇到这个问题还是不细心,课程中有重点强调过这个问题。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星