HDFS——fsimage

2023-02-28 14:20:12 浏览数 (1)

【前言】

在《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文件删除,具体的删除依据由下面几个配置文件决定:

代码语言:javascript复制
dfs.namenode.num.checkpoints.retained

fsimage文件的保留个数,默认值为2,也就是最多保存2个fsimage文件。

代码语言:javascript复制
dfs.namenode.max.extra.edits.segments.retained

editlog文件保留个数,默认值为10000。

代码语言:javascript复制
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的时机由这么几个配置项决定

代码语言:javascript复制
dfs.namenode.checkpoint.period

执行checkpoint的最小时间间隔,默认为3600秒,即1小时。

代码语言:javascript复制
dfs.namenode.checkpoint.txns

触发checkpoint的事务数,默认值为1000000。

代码语言:javascript复制
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使用,

0 人点赞