Hadoop源码分析之DateNode的目录构成与类继承结构

在继续分析NameNode启动之前,先看看DateNode与NameNode的目录构成与类继承结构,NameNode与DataNode的启动过程与这些目录结构和类继承结构相关,在启动的过程中会检查目录的状态。这里所分析的类的继承结构是与存储文件相关的类,与数据交换有关的类暂不考虑。

DataNode的文件目录结构

DataNode目录就是数据节点上存放与数据块相关数据的目录,由${dfs.data.dir}属性指定,这个属性可以指定多个值,值之间使用逗号隔开,如“/data1/datanode,/data2/datanode”指定类两个目录来存放数据节点。如果不指定${data.data.dir}数据块将会放在一个名为tmp的临时目录中,下文中就用${dfs.data.dir}代表数据节点的存储目录。DataNode启动之后${dfs.data.dir}目录中有四个目录和两个文件,如下图所示。

其中in_use.lock文件是在DataNode节点启动之后产生的,其中各个目录的作用如下:

  • blocksBeingWritten:该文件夹保存着当前正在”写“的数据块。
  • current:保存着HDFS文件系统中的数据块,这些数据块是成功提交到HDFS中的数据块。
  • detach:用于配合数据节点升级,共数据块分离操作保存临时工作文件。
  • tmp:该文件夹保存着当前正在”写“的数据块,和blockBeingWritten文件夹的区别是,blockBeingWritten中的数据块写操作由客户端发起,tmp中的写操作由数据块复制引发,另一个数据节点正在发送数据到数据块中。
  • storage:0.13版本以前的Hadoop使用storage文件作为数据块的保存目录,和现在的目录结构不兼容,这个文件用于防止过旧的Hadoop版本在新的目录结构上启动,损坏系统。
  • in_use.lock:表明目录已经被使用,停止数据节点,该文件会消失,通过in_use.lock文件,数据节点可以保证独自占用该目录,防止两个数据节点示例共享一个目录,造成混乱。

current目录是数据节点中最重要的一个目录,它用于存放数据块,该目录中既包含目录,也包含文件,其中文件有两种类型:

  • HDFS数据块,保存着HDFS文件的内容;
  • 用于保存数据块的校验信息的校验信息文件,以meta后缀名标识;
  • VERSION文件是一个Java属性文件,包含了HDFS的版本信息。

current目录如下图所示:


在这个图片中,没有目录,是因为当前的数据节点中的文件块的数量较少,只有当目录中存储的数据块增加到一定规模时,子目录名以subdir为前缀,然后后面加上目录编号,数据节点会创建一个新目录,用于保存新的块及元数据。目录中的数据块数达到64时,便会创建子目录,并形成一个更宽的目录结构,同时\统一父目录下最多会创建64个子目录,所以在默认配置下,一个目录下最多只有64个文件块和64个子目录。这种目录管理方式既保证了目录深度不会太深,而影响检索文件性能,同时也避免了目录保存大量数据块,确保每个目录中的文件块是可控的。

DataNode中类的继承结构

在HDFS中,与上面的目录和文件对应的类有多个,这些类组成一个继承结构,根类是StorageInfo类,继承结构如下图所示:


其中NamespaceInfo包含HDFS集群的一些信息,CheckpointSignature则用于标识名字节点元数据的检查,这两个类出现在HDFS节点间通信的远程接口中,分别应用于DataNode节点和NameNode节点通信的DatanodeProtocol接口和SecondNameNode节点和NameNode节点通信的NamespaceProtocol。StorageInfo包含了三个成员变量,类的定义和成员变量的代码如下:

public class StorageInfo {
	/**是一个负整数,保存了HDFS存储系统信息结构的版本号**/
  public int   layoutVersion;  // Version read from the stored file.
  /**存储系统的唯一标识符**/
  public int   namespaceID;    // namespace id of the storage
  /**该信息的创建时间**/
  public long  cTime;          // creation timestamp

}

这三个成员变量分别对应这VERSION文件中的内容,在上文中说过VERSION文件是一个Java属性文件,包含了HDFS的版本信息。DataNode节点的current目录中有一个VERSION文件,来标识当前DataNode节点的版本信息,NameNode节点同样有一个VERSION节点,来标识NameNode节点的版本信息,但是DataNode节点目录中的VERSION文件比NameNode节点目录中的VERSION文件多一个storageID属性,它表示一个数据节点在集群中的唯一标识,VERSION文件中的属性及其意义如下:

  • namespaceID:存储系统的标识
  • layoutVersion:HDFS存储系统信息结构的版本号
  • ctime:存储系统创建时间
  • storageType:表示节点类型

StorageInfo类中的三个成员变量分别对应上述的namespaceID、layoutVersion和ctime。

StorageInfo的子类Storage是一个抽象类,它为数据节点、名字节点等提供通用的存储服务,在Storage类中有一个内部类StorageDirectory类,一个Storage对象管理着多个StorageDirectory对象,在Storage中用成员变量storag

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值