前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDFS——fsimage

HDFS——fsimage

作者头像
陈猿解码
发布2023-02-28 14:20:12
7060
发布2023-02-28 14:20:12
举报
文章被收录于专栏:陈猿解码

【前言】

《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使用,
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈猿解码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档