Hadoop3 - Java Api 操作 HDFS

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop3 - Java Api 操作 HDFS相关的知识,希望对你有一定的参考价值。

一、HDFS

上篇文章对 HDFS 进行了简单的介绍,并且使用 Shell Cli 对 HDFS 进行了一些基本的操作,本篇文章使用 Java Api 对 HDFS 进行操作,下面是上篇文章地址:

https://blog.csdn.net/qq_43692950/article/details/127172685

如果在 windows 环境下使用 Java Api 进行操作,需要 hadoop.dll 和 winutils.exe ,可以下载Hadoop源码在windows平台编译,编译出windows本地库。

如果运行依然有问题,可以下载编译好的包:

https://download.csdn.net/download/qq_43692950/86735936

然后配置Hadoop环境变量

HADOOP_HOME=D:\\soft\\hadoop-3.1.4
path=;%HADOOP_HOME%\\bin

其中 Java Api 中有两个核心类:

  • Configuration 配置对象类,用于加载或设置参数属性

  • FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。

下面围绕这两个核心类进行操作:

二、Java Api 操作搭建

首先创建一个 Maven 项目,添加 Hadoop 的依赖:

<dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-common</artifactId>
     <version>3.1.4</version>
 </dependency>

 <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-hdfs</artifactId>
     <version>3.1.4</version>
 </dependency>

 <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-client</artifactId>
     <version>3.1.4</version>
 </dependency>

声明 Configuration ,并添加 hdfs 的连接地址:

org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.40.172:8020");

通过 Configuration 获得一个文件系统连接

FileSystem fileSystem = FileSystem.get(conf);

下面通过 FileSystem 创建一个目录:

boolean mkdirs = fileSystem.mkdirs(new Path("/had/test/t1"));
System.out.println(mkdirs);

如果出现下面错误,是因为以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限,可以通过修改HDFS文件系统权限,或者设置客户端身份,该身份具备在HDFS操作权限。

设置客户端身份,注意需要放在获取 FileSystem 之前:

System.setProperty("HADOOP_USER_NAME","root");

重新运行,如果没有出错,就可以到 HDFS 中来看下,是否创建成功:

目录已经创建成功!

最后使用完毕后,不要忘记对 FileSystem 进行关闭:

fileSystem.close();

三、Java Api 文件操作

  • 上传文件(指定路径)

//本地文件路径
Path src = new Path("D:/test.txt");
//hdfs目标路径
Path dst = new Path("/had/test/t1");
// 上传文件 参数(源路径,目标路径)
fileSystem.copyFromLocalFile(src,dst);

到 HDFS 中查看是否上传成功


已成功上传!

  • 上传文件(基于文件流 )

//文件流
InputStream in = new FileInputStream("D:/test.txt");
//获得 hdfs 文件流
OutputStream out = fileSystem.create(new Path("/had/test/t1/test1.txt"));
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);

到 HDFS 中查看是否上传成功

已成功上传!

  • 下载文件(指定路径)

//hdfs目标路径
Path src = new Path("/had/test/t1/test.txt");
//本地文件路径
Path dst = new Path("D:/test/test2.txt");
// 下载文件 参数(源路径,目标路径)
fileSystem.copyToLocalFile(src,dst);

到本地路径中查看,是否上传成功:

已经下载成功!

  • 下载文件(基于文件流)

// 获得 hdfs 文件流
InputStream in = fileSystem.open(new Path("/had/test/t1/test1.txt"));
// 本地文件流
OutputStream out = new FileOutputStream("D:/test/test1.txt");
IOUtils.copyBytes(in, out, 4096, true);

到本地路径中查看,是否上传成功:

已经下载成功!

  • 删除文件

//删除指定的文件。参数:false:表示是否递归删除
boolean b = fileSystem.delete(new Path("/had/test/t1/test1.txt"), false);
System.out.println(b);

到 HDFS 中查看:

已经删除

以上是关于Hadoop3 - Java Api 操作 HDFS的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop3 - Java Api 操作 HDFS

使用java API如何获取给定路径的HDF文件结构

读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理

✨[hadoop3.x系列]HDFS REST HTTP API的使用WebHDFS

[hadoop3.x系列]HDFS REST HTTP API的使用WebHDFS

大数据讲课笔记4.4 使用Java API操作HDFS