Java操作HDFS
2021/7/13 22:06:32
本文主要是介绍Java操作HDFS,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我们使用maven作为依赖管理,首先添加依赖
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.0</version> </dependency>
上传文件
package com.imooc.hdfs; import org.apache.hadoop.conf.Configuration; 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.net.URI; /** * Java代码操作HDFS * 文件操作:上传文件、下载文件、删除文件 */ public class HdfsOp { public static void main(String[] args) throws Exception{ //创建一个配置对象 Configuration conf = new Configuration(); //指定HDFS的地址 conf.set("fs.defaultFS","hdfs://bigdata01:9000"); //获取操作HDFS的对象 FileSystem fileSystem = FileSystem.get(conf); //获取HDFS文件系统的输出流 FSDataOutputStream fos = fileSystem.create(new Path("/user.txt")); //获取本地文件的输入流 FileInputStream fis = new FileInputStream("~/user.txt"); //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFSHDFS IOUtils.copyBytes(fis,fos,1024,true); } }
Tips:如果碰到报错
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException)
,可以去掉hdfs的用户权限检验机制,通过在hdfs-site.xml中配置dfs.permissions.enabled为false即可
当然我们在实际使用过程中需要对代码进行封装,我们可以改成以下的形式:
package com.imooc.hdfs; import org.apache.hadoop.conf.Configuration; 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.IOException; import java.net.URI; /** * Java代码操作HDFS * 文件操作:上传文件、下载文件、删除文件 * Created by xuwei */ public class HdfsOp { public static void main(String[] args) throws Exception{ //创建一个配置对象 Configuration conf = new Configuration(); //指定HDFS的地址 conf.set("fs.defaultFS","hdfs://bigdata01:9000"); //获取操作HDFS的对象 FileSystem fileSystem = FileSystem.get(conf); put(fileSystem); } /** * 文件上传 * @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("~/user.txt"); //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS IOUtils.copyBytes(fis,fos,1024,true); } }
下载文件
执行代码,验证文件是否生成,如果有就表示执行成功
private static void get(FileSystem fileSystem) throws IOException{ //获取HDFS文件系统的输入流 FSDataInputStream fis = fileSystem.open(new Path("/README.txt")); //获取本地文件的输出流 FileOutputStream fos = new FileOutputStream("~/README.txt"); //下载文件 IOUtils.copyBytes(fis,fos,1024,true); }
删除文件
执行删除操作代码
private static void delete(FileSystem fileSystem) throws IOException{ //删除文件,目录也可以删除 //如果要递归删除目录,则第二个参数需要设置为true //如果是删除文件或者空目录,第二个参数会被忽略 boolean flag = fileSystem.delete(new Path("/LICENSE.txt"),true); if(flag){ System.out.println("删除成功!"); } else { System.out.println("删除失败!"); } }
然后到hdfs中验证文件是否被删除,从这里可以看出来/LICENSE.txt文件已经被删除
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -ls / Found 3 items -rw-r--r-- 2 root supergroup 22125 2020-04-08 15:55 /NOTICE.txt -rw-r--r-- 2 root supergroup 1361 2020-04-08 15:55 /README.txt -rw-r--r-- 3 yehua supergroup 17 2020-04-08 20:31 /user.txt
这篇关于Java操作HDFS的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16ShardingSphere 如何完美驾驭分布式事务与 XA 协议?
- 2024-11-16ShardingSphere如何轻松驾驭Seata柔性分布式事务?
- 2024-11-16Maven资料入门指南
- 2024-11-16Maven资料入门教程
- 2024-11-16MyBatis Plus资料:新手入门教程与实践指南
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南