Java操作hdfs,总是报ClosedChannelException

news/2024/5/20 5:30:44 标签: java, hdfs, 开发语言

现象

java">public boolean uploadFile(MultipartFile file, String dst) {
	try {
		long start = System.currentTimeMillis();
		// 创建Hadoop配置对象
		Configuration config = new Configuration();
		config.set("fs.defaultFS", hdfsUri);
		Path dstPath = new Path(ROOT_PATH + dst);
		FileSystem fs = dstPath.getFileSystem(config);
		// 上传文件到HDFS
		InputStream in = new BufferedInputStream(file.getInputStream());
		OutputStream out = fs.create(dstPath);
		IOUtils.copyBytes(in, out, 128000000, true);
		in.close();
		// 关闭FileSystem对象
		fs.close();
		long end = System.currentTimeMillis();
		logger.info("文件名称: {} 耗时: {}", dst, end - start);
		return true;
	} catch (Exception e) {
		logger.error("文件:{}, 上传错误!, ", dst, e);
		return false;
	}
}

以上代码,如果多个请求同时过来,
会报 java.nio.channels.ClosedChannelException: null at org.apache.hadoop.hdfs.ExceptionLastSeen.throwException4Close

网上居然很难找到正确答案,经过多次尝试,修改后,

java">public boolean uploadFile(MultipartFile file, String dst) {
	try {
		long start = System.currentTimeMillis();
		// 创建Hadoop配置对象
		Configuration config = new Configuration();
		config.set("fs.defaultFS", hdfsUri);
		Path dstPath = new Path(ROOT_PATH + dst);
		FileSystem fs = dstPath.getFileSystem(config);
		// 上传文件到HDFS
		InputStream in = new BufferedInputStream(file.getInputStream());
		OutputStream out = fs.create(dstPath);
		IOUtils.copyBytes(in, out, 4096, true);
		in.close();
		// 关闭FileSystem对象
		<font color="red">// fs.close();</font>
		long end = System.currentTimeMillis();
		logger.info("文件名称: {} 耗时: {}", dst, end - start);
		return true;
	} catch (Exception e) {
		logger.error("文件:{}, 上传错误!, ", dst, e);
		return false;
	}
}

如上,不要执行fs.close();就好了。

原因:

经过查阅资料和查看源码,
FileSystem fs = dstPath.getFileSystem(config); 不是新建,而是从CACHE中拿。
所以多个请求关了同一个fs。

参考:
https://arganzheng.life/hadoop-filesystem-closed-exception.html


http://www.niftyadmin.cn/n/5467557.html

相关文章

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中&#xff0c;我们讲解了如何使用汇编来编写 LED 灯驱动&#xff0c;实际工作中是很少用到汇编去写嵌入式驱动的&#xff0c;毕竟汇编太难&#xff0c;而…

基于Springboot+vue的宠物服务管理系统+论文文档

基于Springbootvue的宠物服务管理系统论文文档 预览 简介 本系统共分为三个角色&#xff1a;管理员、用户&#xff1a; 管理员&#xff1a;管理员管理、密码修改、用户管理、充值管理、商品分类管理、商品信息管理、订单信息管理、分享趣事管理、医疗服务管理、服务预约管理…

Navicat for MySQL 15免费注册方法

一、效果图如下&#xff1a; 注&#xff1a;此方法仅用于非商业用途&#xff0c;请勿传播&#xff0c;否则后果自负。 二、下载安装 下载安装包&#xff0c;分为32位和6位&#xff0c;下载文件名&#xff1a;Navicat for MySQL 15.zip&#xff08;https://download.csdn.net/…

鸿蒙南向开发案例:【智能养花机】

样例简介 智能养花机通过感知花卉、盆栽等植宠生长环境的温度、湿度信息&#xff0c;适时为它们补充水分。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可远程进行浇水操作。用户还可在应用中设定日程&#xff0c;有计划的按日、按周进行浇水。在日程中用户可添…

大数据学习第十一天(复习linux指令3)

1、su和exit su命令就是用于账户切换的系统命令 基本语法&#xff1a;su[-] [用户名] 1&#xff09;-表示是否在切换用户后加载变量&#xff0c;建议带上 2&#xff09;参数&#xff1a;用户名&#xff0c;表示切换用户 3&#xff09;切换用户后&#xff0c;可以通过exit命令退…

jquery,js,html前端select标签option标签可以不用单选,可以复选

只需要在如图所示&#xff0c;select标签中添加multiple"multiple"属性即可

网络编程的学习2

UDP通信协议 发送数据 package UDPDEmo;import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets;public class SendMessageDemo {public static void main(String[] args) throws IOException {//发送数据//1.创建对象//细节&#xff1a;…