天天看点

hadoop文件系统与I/O流

hadoop借鉴了linux虚拟文件系统的概念,引入了hadoop抽象文件系统,并在此基础上,提供了大量的具体文件系统的实现,满足构建于hadoop上应用的各种数据访问需求

hadoop提供一个抽象的文件系统,hdfs只是这个抽象文件系统的一个具体的实现。hadoop文件系统的抽象类org.apache.hadoop.fs.filesystem

hadoop抽象文件系统的方法可以分为两部分:

1、用于处理文件和目录的相关事务

2、用于读写文件数据

hadoop抽象文件系统的操作

hadoop的filesystem

java操作

linux操作

描述

url.opensteam

filesystem.open

filesystem.create

filesystem.append

url.openstream

open

打开一个文件

fsdatainputstream.read

inputsteam.read

read

读取文件中的数据

fsdataoutputstream.write

outputsteam.write

write

向文件写入数据

fsdatainputstream.close

fsdataoutputstream.close

inputsteam.close

outputsteam.close

close

关闭一个文件

fsdatainputstream.seek

randomaccessfile.seek

lseek

改变文件读写位置

filesystem.getfilestatus

filesystem.get*

file.get*

stat

获取文件/目录的属性

filesystem.set*

file.set*

chmod等

改变文件的属性

filesystem.createnewfile

file.createnewfile

create

创建一个文件

filesystem.delete

file.delete

remove

从文件系统中删除一个文件

filesystem.rename

file.renameto

rename

更改文件/目录名

filesystem.mkdirs

file.mkdir

mkdir

在给定目录下创建一个子目录

rmdir

从一个目录中删除一个空的子目录

filesystem.liststatus

file.list

readdir

读取一个目录下的项目

filesystem.getworkingdirectory

getcwd/getwd

返回当前工作目录

filesystem.setworkingdirectory

chdir

更改当前工作目录

通过filesystem.getfilestatus()方法,hadoop抽象文件系统可以一次获得文件/目录的所有属性,这些属性被保存在类filestatus中

filestatus实现了writable接口,也就是说,filestatus可以被序列化后在网络上传输,同时一次性将文件的所有属性读出并返回到客户端,可以减少在分布式系统中进行网络传输的次数

完整的filestatus类的源代码如下:

hadoop文件系统与I/O流

filestatus

出现在filesystem中的,但在java文件api中找不到对应的方法有:setreplication()、getreplication()、getcontentsummary(),其声明如下:

实现一个hadoop具体文件系统,需要实现的功能有哪些?下面整理org.apache.hadoop.fs.filesystem中的抽象方法:

实现一个具体的文件系统,至少需要实现上面的这些抽象方法

hadoop完整的filesystem类的源代码如下:

hadoop文件系统与I/O流

filesystem

hadoop抽象文件系统和java类似,也是使用流机制进行文件的读写,用于读文件数据流和写文件的抽象类分别是:fsdatainputstream和fsdataoutputstream

1、fsdatainputstream

可以看到,fsdatainputstream继承自datainputstream类,实现了seekable和positionedreadable接口

seekable接口提供在(文件)流中进行随机存取的方法,其功能类似于randomaccessfile中的getfilepointer()和seek()方法,它提供了某种随机定位文件读取位置的能力

seekable接口代码以及相关注释如下:

完整的fsdatainputstream类源代码如下:

hadoop文件系统与I/O流

fsdatainputstream

fsdatainputstream实现的另一个接口是positionedreadable,它提供了从流中某一个位置开始读数据的一系列方法:

positionedreadable中的3个读方法,都不会改变流的当前位置,而且还是线程安全的

2、fsinputstream

org.apache.hadoop.fs包中还包含抽象类fsinputstream。seekable接口和positionedreadable中的方法都成为这个类的抽象方法

在fsinputstream类中,通过seekable接口的seek()方法实现了positionedreadable接口中的read()方法

完整的fsinputstream源代码如下:

hadoop文件系统与I/O流

fsinputstream

注意:hadoop中没有相对应的fsoutputstream类

3、fsdataoutputstream

fsdataoutputstream用于写数据,和fsdatainputstream类似,继承自dataoutputstream,提供

writeint()和writechar()等方法,但是fsdataoutputstream更加的简单,没有实现seekable接口,也就是说,hadoop文件系统不支持随机写,用户不能在文件中重新定位写位置,并通过写数据来覆盖文件原有的内容。

单用户可以通过getpos()方法获得当前流的写位置,为了实现getpos()方法,fsdataoutputstream定义了内部类

positioncache,该类继承自filteroutputstream,并通过重载write()方法跟踪目前流的写位置.

positioncache是一个典型的过滤流,在基础的流功能上添加了getpos()方法,同时利用filesystem.statistics实现了文件系统读写的一些统计。

fsdataoutputstream实现了syncable接口,该接口只有一个函数sync(),其目的和linux中系统调用sync()类似,用于将流中保存的数据同步到设备中