启动流程
- 检查配置项${dfs.data.dir}对应的存储目录是否创建,是否具有读写的权限检查;
- 获取本节点的主机名称和NameNode的地址,以及其他一些运行时需要的配置项;
- 构造向NameNode注册需要的DataNodeRegistration对象,并在接下来进行一些属性的初始化;
- 建立到NameNode的IPC连接,并调用
handshake()
方法与NameNode进行握手,得到了NamespaceInfo对象,包含了layoutVersion、namespaceID、cTime等信息; - 构造数据节点存储DataStorage对象,执行可能的存储空间状态恢复,接着构造数据节点使用的FSDataset对象;
- 创建流式接口服务器DataXceiverServer对象;
- 创建数据块扫描器DataBlockScanner对象;
- 创建数据节点上的HTTP信息服务器,该服务器提供了数据节点上的运行状态信息;
- 创建该数据节点IPC服务器,对外提供ClientDatanodeProtocol和InterDatanodeProtocol远程接口服务;
- 最后,调用NameNode的远程接口
register()
进行注册,并启动DataNode线程开始对外提供服务。
存储目录的文件结构以及特点
blocksBeingWritten:保存了客户端发起的,当前正在写的数据块;
detach:用于配合数据节点升级,==数据块分离==操作时的临时文件夹;
tmp:保存了用于数据块复制时,当前正在写的数据块;
in_user.lock:表示当前目录已经被使用,实现了一种锁机制,这样DataNode可以独自使用该目录;
current:保存了已写入HDFS文件系统的数据块和一些系统工作时需要的文件;
- blk_开头的文件:HDFS数据块,用来保存HDFS文件内容;
- .meta后缀文件:CRC32校验文件,保存数据块的校验信息;
当current目录达到一定规模时(由配置项${dfs.datanode.numblocks}指定),DataNode会在current目录下新创建一个子目录subdir*,用于保存新的数据块和元数据。
默认配置下,current目录下最多只有64个数据块(128个文件)和64个子目录。通过这种手段,DataNode既保证目录不会太深,影响文件检索性能,同时也避免了某个目录保存大量的数据块。
对存储目录的管理
数据节点的业务逻辑主要由文件结构对象提供的服务进行管理,数据节点的文件结构管理包括两部分内容:数据节点存储DataStorage和文件系统数据集FSDataSet。
DataStorage
数据节点存储DataStorage是抽象类Storage的子类,而抽象类Storage又继承自StorageInfo。和DataStorage同级的FSImage类主要用于组织NameNode的磁盘数据,FSImage的子类CheckpointStorage,则管理SecondaryNameNode使用的文件结构。
StorageInfo包含了三个重要的共有的属性,包括HDFS存储系统信息结构版本号layoutVersion、存储系统标识namespaceID和存储系统创建时间cTime。这些信息都保存在current目录下的VERSION文件中,典型的VERSION文件内容为:
namespaceID=1301932004
storageID=DS-1056522850-172.31.207.102-50010-1498861743747
cTime=0
storageType=DATA_NODE
layoutVersion=-32
在StorageInfo的基础上,抽象类Storage可以管理多个目录,存储目录的实现类为StorageDirectory,它是Storage的内部类,提供了在存储目录上的一些通用操作。
DataStorage扩展了Storage,专注于数据节点存储空间的生命周期管理,其代码可以分为两个部分:升级相关和升级无关的。在数据节点第一次启动时,会调用DataStorage.format()
创建存储目录结构,通过删除原有目录及数据,并重新创建目录,然后将VERSION文件的属性赋值,并持久化到磁盘中。
DataStorage的升级操作
HDFS升级时需要复制以前版本的元数据(对NameNode)和数据(对DataNode)。在DataNode上,升级并不需要两倍的集群存储空间,DataNode使用了Linux文件系统的硬链接技术,可以保留对同一个数据块的两个引用,即当前版本和以前版本。通过这样的技术,就可以在需要的时候,轻松回滚到以前版本的文件系统。
硬链接是一种特殊的文件系统机制,它允许一个文件可以有多个名称。当一个文件有多个名称时,删除其中的一个名称