HDFS 2.X源码剖析(一)

HDFS 2.X源码剖析(一)

一.HDFS概述

HDFS是一个主/从(Mater/Slave)体系结构,从最终用户的角度来看,它就像传统的文件系统一样,可以通过目录路径对文件执行CRUD(Create、Read、Update和Delete)操作。但由于分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNode。NameNode管理文件系统的元数据,DataNode存储实际的数据。客户端通过同NameNode和DataNodes的交互访问文件系统。客户端联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。

1.HDFS体系结构

HDFS 2.X源码剖析(一)
NN管理了HDFS两个最重要的关系:
目录文件树结构和文件与数据块的对应关系:会持久化到物理存储中,文件名叫做fsimage。
DN与数据块的对应关系,即数据块存储在哪些DN中:在DN启动时会上报到NN它所维护的数据块。这个是动态建立的,不会持久化。因此,集群的启动可能需要比较长的时间。
而DN则保存了数据块。并且执行NN的命令,比如复制,拷贝,删除等操作。
Client则是使用HDFS的主题,包括写文件,读文件等常见操作。

HDFS基本概念

数据块

上文多次提到数据块,那么什么是数据块?为了便于管理,设备往往将存储空间组织成具有一定结构的存储单位。比如硬盘,文件以块的形式存储在硬盘中,块的大小代表了系统读和写操作的最小单位;在Linux的Ext3文件系统中,块的大小默认为4K。文件系统通过一个块大小的整数倍来使用硬盘。硬盘上的数据块管理属于文件系统实现的内部细节;对于调用系统接口来读写文件的用户来说是透明的。
HDFS的块也是类似的原理。只不过它的块拥有更大的数据单元,默认的数据块大小是64M。HDFS将文件进行分块,块作为单独的存储单元,在Linux上以普通文件的形式保存在DN的文件系统中。数据块是HDFS文件存储的基本单位。在这里要注意,HDFS并不直接管理硬盘,它是通过DN上的文件系统存储数据块,通过管理数据块,来完成文件管理服务的。
HDFS是针对大文件设计的分布式系统,使用数据块有许多的好处:

文件大小不受单个DN的存储空间限制,文件可以保存到任意的DN上。
简化了存储子系统。简单化是所有系统的设计追求。特别是在故障种类繁多的分布式系统。将管理块和管理文件分开,简化了存储管理,也消除了分布式管理文件元数据的复杂性。
方便容错,有利于数据复制。在HDFS中,为了应对损坏的块以及硬盘,机器故障,数据块会在不同的节点上进行复制。如果一个数据块的副本丢失或者损坏,系统会在其他地方读取副本,并且数据块会复制到一个正常运行的节点上,保证数据块副本数的最低要求。当然了,这个过程对于Client来说是透明的,它实现了分布式系统中的位置透明性和故障透明性。
那么为什么数据块那么大呢?其实和文件系统的大数据块的原理是一样的。在普通的文件系统中使用较大的数据块,可以减少管理数据块所需要的开销,如在Linux中可以减少保存在i-node中硬盘地址表中的信息链的长度;同时在对文件进行读写时,可以减少寻址开销,即硬盘定位数据块的次数。在HDFS中采用大数据库唉,可以减少NN上管理文件和数据块关系的开销,而且在文件读写时,减少因为建立网络连接的开销。

NN

NN是HDFS主从结构中主节点上运行的主要进程,它负责管理从节点DN。NN维护着整个文件系统的文件目录树,文件目录的元信息和文件的数据块索引。这些信息以两种信息保存在本文文件系统中,一种是文件系统镜像(文件名字fsimage),另一种是fsimage的编辑日志(文件名字edits)。
fsimage中保存着某一特定时刻HDFS的目录树、元信息和文件数据块的索引等信息,后续的对这些信息的改动,则保存在编辑日志中,它们一起提供了一个完整的NN的第一关系。
同时,通过NN,Client还可以了解到数据块所在的DN的信息。需要注意的是,NN中关于DN的信息是不会保存到NN的本地文件系统的,也就是上面提到的fsimage和edits中。NN每次启动时,都会通过每个DN的上报来动态的建立这些信息。这些信息也就构成了NN第二关系。

 另外,NN还能通过DN获取HDFS整体运行状态的一些信息,比如系统的可用空间,已经使用的空间,各个DN的当前状态等。

DN

DN是HDFS中硬盘IO最忙碌的部分:将HDFS的数据块写到Linux本地文件系统中,或者从这些数据块中读取数据。DN作为从节点,会不断的向NN发送心跳。初始化时,每个DN将当前节点的数据块上报给NN。NN也会接收来自NN的指令,比如创建、移动或者删除本地的数据块,并且将本地的更新上报给NN。

Client

Client是用户和HDFS进行交互的手段,HDFS提供了各种各样的Client,包括CLI,Java API,Thrift接口,C语言库,用户空间文件系统(FUSE)等。虽然Hadoop不是一个POSIX的文件系统,不支持ls,cp这样的命令,但是Hadoop还是提供了一套和Linux文件命令类似的命令行工具。

HDFS 通信协议

1.HDFS RPC接口:HDFS中基于Hadoop RPC框架实现的接口
2.流式接口:HDFS中基于TCP或者HTTP实现的接口