使用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 进行操作,下面是上篇文章地址:
如果在 windows 环境下使用 Java Api 进行操作,需要 hadoop.dll 和 winutils.exe ,可以下载Hadoop源码在windows平台编译,编译出windows本地库。
如果运行依然有问题,可以下载编译好的包:
然后配置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时,_方法用于获取文件列表?的主要内容,如果未能解决你的问题,请参考以下文章