使用Java API操作HDFS时,_方法用于获取文件列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java API操作HDFS时,_方法用于获取文件列表?相关的知识,希望对你有一定的参考价值。

当使用 Java API 操作 HDFS 时,可以使用 FileSystem.listFiles() 方法来获取文件列表。该方法接受一个 Path 对象,表示要列举文件的目录,并返回一个 RemoteIterator<LocatedFileStatus> 对象,该对象可用于迭代目录中的文件。
例如,下面的代码演示了如何使用 listFiles() 方法来获取 HDFS 上的文件列表:
// 定义 HDFS 连接配置
Configuration conf = new Configuration();
// 获取 HDFS FileSystem 对象
FileSystem fs = FileSystem.get(conf);
// 定义要列举文件的目录
Path dirPath = new Path("/user/hadoop");
// 获取文件列表
RemoteIterator<LocatedFileStatus> fileIter = fs.listFiles(dirPath, true);
// 遍历文件列表
while (fileIter.hasNext())
// 获取当前文件信息
LocatedFileStatus fileStatus = fileIter.next();
// 输出文件名称和大小
System.out.println(fileStatus.getPath().getName() + " : " + fileStatus.getLen());
参考技术A 在 Java API 中,可以使用 FileSystem.listFiles() 方法来获取 HDFS 上文件的列表。该方法接受一个路径作为参数,并返回一个包含文件信息的迭代器。您可以使用该迭代器来遍历 HDFS 上的文件,并获取每个文件的名称,大小等信息。例如,以下代码展示了如何使用 FileSystem.listFiles() 方法来获取 HDFS 上的文件列表:
Path path = new Path("/path/to/directory");
FileSystem fs = FileSystem.get(new Configuration());
RemoteIterator<LocatedFileStatus> fileStatusIterator = fs.listFiles(path, true);
while (fileStatusIterator.hasNext())
LocatedFileStatus fileStatus = fileStatusIterator.next();
String fileName = fileStatus.getPath().getName();
long fileSize = fileStatus.getLen();
// do something with the file name and size

在上面的代码中,我们首先使用 Path 类来指定要获取文件列表的目录路径。然后,我们使用 FileSystem 类来获取 HDFS 文件系统的实例。接下来,我们调用 FileSystem.listFiles() 方法来获取该目录中的文件列表。最后,我们使用 RemoteIterator 来遍历文件列表,并获取每个文件的名称和大小。
参考技术B FileSystem类的listStatus()方法用于获取文件列表。

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 中查看:

已经删除

以上是关于使用Java API操作HDFS时,_方法用于获取文件列表?的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop3 - Java Api 操作 HDFS

Hadoop3 - Java Api 操作 HDFS

Hadoop3 - Java Api 操作 HDFS

Java API操作Hdfs详细示例

Java API操作Hdfs详细示例

大数据HadoopHDFS的Java API操作