HDFS 基本文件操作API

本文详细介绍了Hadoop HDFS中的文件操作API,包括文件的创建、打开、信息获取、读取、写入、关闭及删除等核心操作,并提供了丰富的参数说明与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDFS 基本文件操作API

按照“创建、打开、获取文件信息、获取目录信息、读取、写入、关闭、删除”的顺序讲解Hadoop 提供的文件操作的API。

1.创建文件
FileSystem.create 方法有很多种定义形式,参数最多的一个:
public abstract FSDataOutputStream create(Path f,  
FsPermission permission,  
boolean overwrite,  
int bufferSize,  
short replication,  
long blockSize,  
Progressable progress) Throws IOException 
那些参数较少的create 只不过是将其中一部分参数用默认值代替,最终还是要调用这个函数。其中各项的含义如下:
f:文件名
overwrite:如果已存在同名文件,overwrite=true 覆盖之,否则抛出错误;默认为true。buffersize : 文件缓存大小。默认值:Configuration 中io.file.buffer.size 的值, 如果Configuration 中未显式设置该值,则是4096。
replication:创建的副本个数,默认值为1。
blockSize :文件的block 大小,默认值:Configuration 中fs.local.block.size 的值,如果Configuration 中未显式设置该值,则是32M。
permission 和progress 的值与具体文件系统实现有关。
但是大部分情况下,只需要用到最简单的几个版本:
publicFSDataOutputStream create(Path f);  
publicFSDataOutputStream create(Path f,boolean overwrite);  
publicFSDataOutputStream create(Path f,boolean overwrite,int bufferSize); 
2. 打开文件
FileSystem.open 方法有2个,参数最多的一个定义如下:
public abstract FSDataInputStream open(Path f, intbufferSize) throws IOException 
其中各项的含义如下:
f:文件名
buffersize :文件缓存大小。默认值:Configuration 中io.file.buffer.size 的值,如果Configuration 中未显式设置该值,则是4096。
3. 获取文件信息

FileSystem.getFileStatus 方法格式如下:
public abstract FileStatus getFileStatus(Path f) throws IOException;
这一函数会返回一个FileStatus 对象。通过阅读源代码可知,FileStatus 保存了文件的很多信息,包括:
path:文件路径
length:文件长度
isDir:是否为目录
block_replication:数据块副本因子
blockSize:文件长度(数据块数)
modification_time:最近一次修改时间
access_time:最近一次访问时间
owner:文件所属用户
group:文件所属组
如果想了解文件的这些信息,可以在获得文件的FileStatus 实例之后,调用相应的getXXX 方法(比如,FileStatus.getModificationTime()获得最近修改时间)。

4. 获取目录信息

获取目录信息,不仅是目录本身,还有目录之下的文件和子目录信息,如下所述。

FileStatus.listStatus 方法格式如下:

public FileStatus[] listStatus(Path f) throws IOException; 

如果f 是目录,那么将目录之下的每个目录或文件信息保存在FileStatus 数组中返回。如果f 是文件,和getFileStatus 功能一致。
另外,listStatus 还有参数为Path[] 的版本的接口定义以及参数带路径过滤器PathFilter的接口定义,参数为Path[] 的listStatus 就是对这个数组中的每个path 都调用上面的参数为Path 的listStatus。参数中的PathFilter 则是一个接口,实现接口的accept 方法可以自定义文件过滤规则。

另外,HDFS 还可以通过正则表达式匹配文件名来提取需要的文件,这个方法是:
public FileStatus[] globStatus(Path pathPattern) throws IOException;
参数pathPattern 中,可以像正则表达式一样,使用通配符来表示匹配规则:

?:表示任意的单个字符。
*:表示任意长度的任意字符,可以用来表示前缀后缀,比如*.java 表示所有java 文件。
[abc]:表示匹配a,b,c 中的单个字符。
[a-b]:表示匹配a-b 范围之间的单个字符。
[^a]:表示匹配除a 之外的单个字符。
\c:表示取消特殊字符的转义,比如\* 的结果是* 而不是随意匹配。
{ab,cd}:表示匹配ab 或者cd 中的一个串。
{ab,c{de,fh}}:表示匹配ab 或者cde 或者cfh 中的一个串。

5. 读取

调用open 打开文件之后,使用了一个FSDataInputStream 对象来负责数据的读取。通过FSDataInputStream 进行文件读取时,提供的API 就是FSDataInputStream.read 方法:
public int read(long position, byte[] buffer, int offset, int length) throws IOException 
函数的意义是:从文件的指定位置position 开始,读取最多length 字节的数据,保存到buffer 中从offset 个元素开始的空间中;返回值为实际读取的字节数。此函数不改变文件当前offset 值。不过,使用更多的还有一种简化版本:
public final int read(byte[] b)throws IOException 
从文件当前位置读取最多长度为b.len 的数据保存到b 中,返回值为实际读取的字节数。

6. 写入

从接口定义可以看出,调用create 创建文件以后,使用了一个FSDataOutputStream 对象来负责数据的写入。通过FSDataOutputStream 进行文件写入时,最常用的API 就是write 方法:
public void write(byte[] b,int off,int len) throws IOException 
函数的意义是:将b 中从off 开始的最多len 个字节的数据写入文件当前位置。返回值为实际写入的字节数。

7. 关闭

关闭为打开的逆过程,FileSystem.close 定义如下:
public void close() throws IOException 
不需要其他操作而关闭文件。释放所有持有的锁。

8. 删除

删除过程FileSystem.delete 定义如下:
public abstract boolean delete(Path f,boolean recursive) throws IOException
其中各项含义如下:
f:待删除文件名。
recursive :如果recursive 为true,并且f 是目录,那么会递归删除f 下所有文件;如果f 是文件,recursive 为true 还是false 无影响。

另外,类似Java 中File 的接口DeleteOnExit,如果某些文件需要删除,但是当前不能被删;或者说当时删除代价太大,想留到退出时再删除的话,FileSystem 中也提供了一个deleteOnExit 接口。
Public Boolean deleteOnExit(Path f) throws IOException 
标记文件f,当文件系统关闭时才真正删除此文件。但是这个文件f 在文件系统关闭前必须存在。


参考:《深入理解大数据:大数据处理与编程实践》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值