【前言】
在《HDFS——editLog文件》一文中提到了namenode(后面简称nn)的元数据信息由editlog和fsimage文件组成。
editlog文件记录对文件系统的写操作,fsimage存放文件系统的元数据信息。
最后也提出了一些问题,例如editlog文件个数的上限,editlog文件与fsimage文件的关系。
本文针对fsimage的一些原理进行总结。
【checkpoint】
hdfs运行过程中,文件系统的所有写操作日志都会记录到editlog文件中,久而久之,就会有大量的editlog文件。
为了避免这种情况的出现,hdfs会定期对这些操作日志进行合并,然后连同内存中记录的元数据信息一并写入文件,这个文件就是fsimage文件,而整个过程就是checkpoint。
由于editlog文件的合并过程会耗时比较长,如果在active namenode(后面均称之为ann)上执行可能会影响文件的正常读写,因此checkpoint通常由standby namenode(后面均称之为snn)触发,其大概流程为:
- snn向ann请求下载最新的一批editlog文件
- snn完成editlog文件的下载后,执行所有这些editlog文件中的操作,并更新在内存中记录的元数据信息
- snn将内存中的元数据信息按一定的格式保存到fsimage文件中
- snn将生成的fsimage上传到ann中
- snn和ann删除各自老的editlog文件和fsimage文件
几个细节:
- snn每次从ann下载完editlog文件,并执行这些editlog文件中的操作后,会保存最后一个事务的ID。这样,下次checkpoint时,从保存的最后一个事务ID到最新的事务ID,请求包含这个事务ID范围内的所有editlog文件。
- 每次checkpoint写fsimage时,fsimage文件名中会包含上面提到的这个事务ID。
【文件删除策略】
checkpoint执行最后,会将老的editlog文件和fsimage文件删除,具体的删除依据由下面几个配置文件决定:
dfs.namenode.num.checkpoints.retained
fsimage文件的保留个数,默认值为2,也就是最多保存2个fsimage文件。
dfs.namenode.max.extra.edits.segments.retained
editlog文件保留个数,默认值为10000。
dfs.namenode.num.extra.edits.retained
editlog文件中保留的事务个数,默认值为1000000。
具体含义为:
每次checkpoint生成新的fsimage文件后,根据fsimage的保留个数,保留最新的几个fsimage文件,其余的都直接删除。
然后从这些保留的fsimage中,得到最小的事务ID,然后结合保留的事务数,保留的editlog文件数,计算出需要保留的editlog文件,并从这些文件中得到最小的事务ID,在该事务ID之前的所有editlog文件都将被删除。
例如:
checkpoint后最后一个事务ID为96796869,保留2个fsimage,因此删除之前的fsiamge;然后往前保留1000000个事务,即从95796870开始,事务ID比这个小的editlog文件都会被删除(包含95796870的editlog会被保留,即便该editlog文件的事务ID可能会比95796870小)。
【checkpoint的触发时机】
触发进行checkpoint的时机由这么几个配置项决定
dfs.namenode.checkpoint.period
执行checkpoint的最小时间间隔,默认为3600秒,即1小时。
dfs.namenode.checkpoint.txns
触发checkpoint的事务数,默认值为1000000。
dfs.namenode.checkpoing.check.period
检测是否满足上面两个条件的时间间隔,默认值为60秒。即1分钟检查一次啊上述两个条件只要符合其一,则执行checkpoint。
【fsimage文件查看】
fsimage以二进制数据写入,直接查看会不方便,因此hdfs提供了命令来查看fsimage文件中的内容,具体命令为:
代码语言:javascript复制hdfs oiv [arg]
必选的参数有:
-i,-inputFile <arg> 待查看的fsimage文件
可选参数有:
-o,-outputFile <arg> 转换后保存的文件
-p,-percessor <arg> 转换的格式,可选值有XML,FileDistribution,ReverseXML,Web,Delimited,默认为Web
-delimiter <arg> 配合-p 指定为Delimited使用,