Hadoop源码分析之HDFS客户端的输入流类结构

当从HDFS集群中读取数据到客户端时,就要用到HDFS中的输入流类了,但是这里使用到了DFSInputSteam,FSInputStream,FSDataInputStream,DFSDataInputStream等这些类,如果不了解Java IO类的设计思想,这里很容易看迷糊,为什么用到类这么多*InputStream类?

装饰器模式与Java IO中的装饰器模式

在Java IO中,也有很多输入流类,比如InputStream,FileInputStream,FilterInputStream,DataInputStream等等,那么这些类是如何组织的呢?什么时候使用FileInputStream,什么时候使用DataInputStream?这就要从装饰器模式开始学习。关于Java IO中的装饰器模式可以参考博文:http://www.cnblogs.com/zuoxiaolong/p/pattern11.html,这篇博文比较清晰的介绍类装饰器模式,以及Java IO的设计者如何将装饰器模式应用到Java IO类的设计中去的。

简单点理解就是,在Java IO相关的类中,InputStream是java IO中的顶层接口类,其他所有的有关IO的类都会直接或者间接用到这个类。FilterInputStream类中持有一个对IpnutStream子类对象的引用,如FileInputStream类的对象,而DataInputStream继承自FilterInputStream,在FilterInputStream类的基础上增加了读取基本的Java数据类型等功能,如使用DataInputStream可以读取一个int类型的数据,可以读取long类型的数据。

HDFS中输入流的装饰器模式

FSInputStream是Hadoop抽象文件系统规定的一个输入流接口,它继承自InputStream抽象类,FSDataInuptStream类是Hadoop抽象文件系统中的一个输入流接口,继承自java.io.DataInputStream,这两个类是Hadoop抽象文件系统规定的类,实现一个具体的Hadoop文件系统的输入流都要从这两个类继承,如HDFS中的DFSInputStream继承自FSInputStream,DFSDataInuptStream继承自FSDataInputStream。

DFSInputStream类是HDFS客户端的输入数据流类,其在HDFS客户端中的作用与InputStream类似类似,直接处理数据。

DFSDataInputStream是HDFS客户端输入流类,其在HDFS客户端中的作用与DataInput在Java IO中的作用类似,它通过持有一个DFSInputStream对象引用来处理数据流

可见,HDFS中的输入流的类结构与Java IO中类似,都使用类装饰器模式来设计输入流的结构。

此外在读取HDFS的的数据过程中DFSInputStream类负责从HDFS中读取数据,在这个过程中需要与远程的机器进行网络通信(暂不考虑本地读取)。这个过程中则使用org.apache.hadoop.hdfs.BlockReader接口的实现类org.apache.hadoop.hdfs.DFSClient.RemoteBlockReader.RemoteBlockReader来读取数据,RemoteBlockReader类继承自org.apache.hadoop.fs.FSInputChecker类,其中FSInputChecker类为数据输入提供了检验能力,RemoteBlockReader通过Socket与远程的机器通信,进而读取HDFS集群中的数据。

Reference

http://www.cnblogs.com/zuoxiaolong/p/pattern11.html

《Hadoop技术内幕:深入理解Hadoop Common和HDFS架构设计与实现原理》


你可能感兴趣的:(Hadoop源码分析之HDFS客户端的输入流类结构)