3.1 DFS分布式文件系统
DistributedFileSystem 所在的包为org.apache.hadoop.hdfs,它继承自FileSystem抽象文件系统,代表Hadoop的分布式文件系统。
hdfs-default.xml是HDFS默认的配置文件,hdfs-site.xml是用户根据需要定制的配置文件。
3.2 DFSClient HDFS客户端
DFSClient 是分布式文件系统HDFS的客户端,它可以连接到Hadoop的文件系统,然后执行基本的文件操作。它使用ClientProtocol协议通过RPC(Remote Procedure CallProtocol ,远程过程调用协议)机制与NameNode进行通信并获得文件的元数据信息,然后连接到DataNode并通过DFSOutputStream和DFSInputStream来进行数据块的真正读写操作。
3.2.1 DFSOutputStream
集成自FSOutputSummer父类,并实现了Syncable接口。FSOutputSummer为数据写入HDFS之前提供了校验和功能。
3.2.2 Packet
DFS通过一个个Packet来想DataNode写入数据。一个Packet由多个数据chunk组成,一个chunk对应一个校验和。当写入足够多的chunk之后,Packet会被添加dataQueue中。
Packet包括心跳packet和数据Packet,心跳packet不包含数据chunk,它在数据Block的头,存储packet长度、偏移量、序列号等信息。
3.2.3 DataStreamer
DataStreamer是真正写入数据的进程。在发送Packet之前,它会首先从NameNode中获得一个新的blockid和Block的位置信息。然后循环地从dataQueue中取得一个Packet,然后将该Packet真正写入到与DataNode所建立的socket之中。当属于一个Block的所有Packet都发送给DataNode,并且返回了与每个Packet所对应的响应信息之后,DataStreamer会关闭当前的数据Block。
3.2.4 ResponseProcessor
继承自Thread,DataStreamer会为写入的每个Block启动一个ResponseProcessor线程,该线程主要用于等待来自DataNode管道中的DataNode的响应。成功响应则将对应Packet从ackQueue删除,否则记录下出错的DataNode,并设置对应的标志位、
3.2.5 DFSDataInputStream
继承自FSDataInputStream,内部包装了一个DFSInputStream实现类,所有功能的实现都是依靠包装DFSInputStream来完成的。
3.2.6 DFSInputStream
继承自FSInputStream,该类会创建到DataNode的Socket连接,然后使用Socket来读取DataNode上的数据信息。
3.2.7 BlockReader
继承自FSInputChecker父类,实现了对读取到的数据进行校验功能。
3.2.8 DNAddrPair
封装了定位到DataNode信息和DataNode所对应的IP信息。
3.2.9 LeaseChecker
HDFS利用Lease租约来解决互斥锁的问题。当DFSClient需要对一个文件执行写入操作时需要向NameNode申请一个租约,是有时间限制的,若发生异常,租约结束后NameNode会发现异常的客户端,防止使用互斥锁失去联系无法释放的情况。
在DFSClient中有个LeaseChecker线程,会周期性的检查租约是否过期,在租约快结束的时候对租约续约。