接下来看一些具体的东西。
从形式上讲,元数据可分为内存元数据和元数据文件两种。其中NameNode在内存中维护整个文件系统的元数据镜像,用于HDFS的管理;元数据文件则用于持久化存储。
NameNode将文件系统的元数据以不同的文件保存在本地磁盘中,其中最重要的两个文件是fsimage 和edits。不懂fsimage和edits可以看这边。和数据库一样,fsimage包含文件系统元数据的完整快照,而edits仅包含元数据的增量修改。通俗地理解是这样的:由于所有的元数据位于内存,其大小随文件系统的规模增大而增大,如果每次都将整个内存元数据导出磁盘,将会带来很大的系统开销,所以HDFS在实现时,没有采用定期导出元数据的方法,而是采用元数据镜像文件(FSImage)+日志文件(edits)的备份机制,其中镜像文件是某一时刻内存元数据的真实组织情况,而日志文件则记录了该时刻以后所有的元数据操作 。
这样的机制存在一个问题:NameNode在为集群提供服务时可能无法提供足够的资源----CPU或RAM来支持此运算。为了解决这一问题,引入了次NameNode
接下来是NameNode和次NameNode的交互示意图:
默认情况下,该过程每小时发生一次,或者当NameNode的edits文件大小达到默认的64MB时也会被触发。尽管后面我们会研究如何改变这些配置,但通常来说无需改变。在新版本的Hadoop中,通过使用预定义的事务次数而不是文件大小来触发该过程。