我们来看一下升级/回滚/提交时的 DataNode 上会发生什么(在类 DataStorage 中
实现)。
前面我们提到过 VERSION 文件,它保存了一些文件系统的元信息,这个文件在系统
升级时,会发生对应的变化。
升级时,NameNode 会将新的版本号,通过 DataNode 的登录应答返回。
DataNode 收到以后,会将当前的数据块文件目录改名,从 current 改名为
previous.tmp,建立一个 snapshot,然后重建 current 目录。重建包括重建
VERSION 文件,重建对应的子目录,然后建立数据块文件和数据块元数据文件到
previous.tmp 的硬连接。建立硬连接意味着在系统中只保留一份数据块文件和数据
块元数据文件,current 和 previous.tmp 中的相应文件,在存储中,只保留一份。
当所有的这些工作完成以后,会在 current 里写入新的 VERSION 文件,并将
previous.tmp 目录改名为 previous,完成升级。
了解了升级的过程以后,回滚就相对简单。因为说有的旧版本信息都保存在 previous
目录里。回滚首先将 current 目录改名为 removed.tmp,然后将 previous 目录改
名为 current,最后删除 removed.tmp 目录。
提交的过程,就是将上面的 previous 目录改名为 nalized.tmp,然后启动一个线程,
将该目录删除。
下图给出了上面的过程:
需要注意的是,HDFS 的升级,往往只是支持从某一个特点的老版本升级到当前版本。
回滚时能够恢复到的版本,也是 previous 中记录的版本。
下面我们继续分析 DataNode。
文字分析完 DataNode 存储在文件上的数据以后,我们来看一下运行时对应的数据结
构。从大到小,Hadoop 中最大的结构是 Storage,最小的结构,在 DataNode 上是
block。
类 Storage 保存了和存储相关的信息,它继承了 StorageInfo,应用于 DataNode
的 DataStorage,则继承了 Storage,总体类图如下:
评论0