Hadoop分布式文件系统HDFS的具体实现

来源:互联网 发布:final cutpro mac 编辑:程序博客网 时间:2024/06/06 00:21

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线程,会周期性的检查租约是否过期,在租约快结束的时候对租约续约。

0 0
原创粉丝点击