以文件流作为一个切面,阅读Hadoop源代码org.apache.hadoop.fs包中源代码。关于流,分为输入流和输出流两种,下面也这样简单划分为两类进行阅读分析。

输入流类

与输入流相关的接口和类的继承层次关系如下所示:

FSDataInputStream类实现了Seekable与PositionedReadable接口,赋予了Hadoop文件系统中的文件输入流分别能够进行流式搜索与定位流式读取的语义。

Seekable接口定义如下:

Seekable 接口中定义的方法,都是基于文件流的位置进行操作的方法,使得在文件系统中或文件系统之间进行流式操作更加方便。

PositionedReadable接口定义如下:

PositionedReadable接口中定义了三个基于位置来进行流式读取的操作。

接着,FSDataInputStream类继承自DataInputStream类,并实现上述这两个接口,必须实现接口中定义的操作:

FSDataInputStream输入流类最显著的特征就是,能够基于流的位置而进行流式操作。

另外,在org.apache.hadoop.fs包中还定义了基于RAF(Random Access File)风格的输入流类,可以随机读取该流对象。继承关系如下所示:

首先看抽象的输入流类,实现的源代码如下所示:

 输出流类

与输出流相关的接口和类的继承层次关系如下所示:

FSDataOutputStream输出流类内部实现了一个基于位置的缓冲输出流类PositionCache,该类的实现如下所示:

创建一个PositionCache缓冲流对象以后,可以向该文件输出缓冲流中写入相关的数据,作为缓冲使用,其中相关数据包括:文件系统(FileSystem)统计信息FileSystem.Statistics、当前待写入流的位置。每当需要向文件系统中写入数据,都会从PositionCache缓冲流中获取到一个写入位置(也就是,要从流中的该位置开始写入)。

FSDataOutputStream输出流类的通过一个PositionCache缓冲流来构造一个FSDataOutputStream输出流对象:

实例化FSDataOutputStream类,能够获取到当前用于要写入数据的流对象,也就是该类包装的输出流类OutputStream类型属性wrappedStream,其中wrappedStream就是一个OutputStream。

基于上面构造方法,缺省设置一些参数,得到如下两个重载的构造方法:

该FSDataOutputStream类实现的方法如下所示:

其中,sync方法表示实现同步流缓冲区的操作,使得缓冲的流对象与原始输出流对象同步,保证写入数据的正确性。 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐