HDFS检查点操作实战篇

             HDFS检查点操作实战篇

                                   作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

一.检查点概述

1>.什么是检查点

  检查点操作时通过合并当前映像文件(fsimage_*)和编辑日志(edits_*)来来创建新的fsimage的过程。

  一旦编辑日志达到指定的阈值(dfs.namenode.checkpoint.txns,该值默认值是"1000000",即100w条记录)或者经过一定的时间(dfs.namenode.checkpoint.period,该值默认值是"3600s",即1小时),编辑日志中的新条目会被提交到fsimage文件。

2>.为什么需要检查点

  需要注意的是,与fsimage文件相比,编辑日志段(共同构成编辑日志的文件)非常小(比如新建的集群未投入生产环境中使用时经常会有几十或几百字节),但如果不使用编辑日志事务定期更新fsimage文件,则编辑日志可以变得非常大!(当然,这会导致NameNode的重启过程延迟。)

  检查点操作定期将最新达到fsimage文件与编辑日志合并,创建一个全新的fsimage。这有助于NameNode直接从fsimage文件加载其最终的内存状态,而不必在编辑日志存储目录中存放大量文件。

  为什么需要保持fsimage(检查点)文件最新呢?
    答:看过我之前分享的NameNode启动流程的小伙伴应该明白这一点:如果很长一段时间没有启动NameNode,你将会面临一个大问题!启动NameNode将花费很长的时间,并且在此期间NameNode不可用(它处于安全模式),直到它完成上次启动以来读取和合并所有编辑日志的更改。Hadoop让Secondary Namenode(或Standby Namenode)定期更新fsimage文件,因此在Namenode重新启动后总是有更新的fsimage可用。

3>.Hadoop 2.x及以上版本中检查点的相关守护进程 

  在Hadoop 2.x及以上版本中,检查点操作可以由以下4个守护程序中的任何一个完成。

  Secondary NameNode:
    Secondary NameNode与其名称所表达的含义不同,其并不真正用作NameNode,它的任务是执行命名空间的定期检查点创建。
    Secondary NameNode不会将已创建检查点的fsimage文件上传到Active NameNode,为了使用检查点文件,必须将文件物理移动到NameNode服务器。

  检查点节点:
    检查点节点与Secondary NameNode有相同的功能,即它定期检查命名空间,帮助保持编辑文件的大小。与Secondary NameNode已有,检查点节点从Naemnode下载编辑日志文件,将其与映像文件合并,并将更新的映像文件发回Namenode。只要你没有注册备份节点,就可用安全地使用多个检查点节点。
    Secondary Namenode和检查点节点之间的主要区别是,与Secondary Namenode不同,检查点节点实际上是将新的映像文件上传到Active NameNode。

  备份节点:
    备份节点是检查节点的扩展。备份节点与Secondary Namenode或检查点节点有基本相同的功能,但其采用不同的机制。此节点维护最新命名空间的内存副本,并确保它与NameNode的命名空间同步。它通过从NameNode获取命名空间更改的流来实现此目的。
    而后,备份节点将这些更改存储到磁盘,并将它们应用于其命名空间的内存副本。由于备份节点不需要传输,合并从NameNode提交的fsimage和编辑日志,它比执行检查点任务的检查点节点更有效。
    由于备份节点的内存中始终有命名空间的备份,因此称为备份节点!当备份节点执行检查点操作时,它不需要从NameNode下载fsimage和编辑日志,它只是将自己的命名空间保存到本地fsimage文件,并将编辑日志文件清零。如果启动备份节点,则无需再集群中启动检查点节点或Standby Namenode。
    如果启动备份节点,则可以运行NameNode,而不需要将命名空间存储在其自己的磁盘系统上。在这种情况下,NameNode仅在内存中维护最新的命名空间。备份节点处理fsimage的实际存储以及磁盘上的编辑日志文件。由于选择不在Active NameNode上存储命名空间,因此还必须删除hdfs-site.xml文件中的"dfs.namenode.name.dir"参数。
    如果你想要启动备份节点,可以依次执行"hdfs namenode -backup""hdfs namenode -importCheckpoint"这两条指令。

  Standby NameNode:
    Standby NameNode节点只存在于HDFS高可用性环境中。它时NameNode服务的热备用。作为Standby Namenode,它还执行通常由其它类型的NameNode之一执行的检查点任务。因此,在高可用性环境中,不应运行备份节点,检查点节点或Secondary NameNode。

 

二.配置检查点操作频率

  检查点操作频率是高度可配置的。在默认情况下,Secondary NameNode每小时或在每100万次事务后执行检查点操作,以先到者为准。可以根据以下两个条件之一配置检查点操作的频率。

  dfs.namenode.checkpoint.txns:
    该值默认值是"1000000",即100w条记录。该属性可以指定自上次执行检查点操作以来的编辑日志事务数。

  dfs.namenode.checkpoint.period:
    该值默认值是"3600s",即1小时。该属性可以指定自上次执行检查点操作以来经过的时间。

  dfs.namenode.num.extra.edits.retained:
    该值默认值也是"1000000",即100w条记录。该属性指定要保留的超出重新启动NameNode所需的最小数量的额外事务数。这在远程Standby NameNode(或者secondary NameNode)已脱机一段时间,并且需要访问更大的积压编辑日志以便重新启动的情况下非常有用。
    此属性的默认值为100万次修改,由于平均编辑日志大小为几百字节,所以默认为100万次编辑意味着保留的编辑日志总大小为几MB(或者几KB)。

  dfs.namenode.max.extra.edits.segments.retained:
    该属性默认值为10000,即1w。此参数指定在重新启动NameNode时需要保留的额外编辑日志段文件的最大数量。
    此属性和上面的"dfs.namenode.num.extra.edits.retained"属性协同工作,以保持总额外编辑量和额外编辑文件数在一个合理的水平。

  dfs.image.transfer.bandwidthpersec:
    该属性允许指定阐述fsimage和edits文件的最大带宽量(以B/s为单位)。此参数用于在执行检查点操作的过程中保持NameNode正常响应。默认值为0,表示没有节流。

  dfs.image.transfer.timeout:
    该属性设置传输映像的套接字超时时间(默认单位为毫秒,即ms)。当映像传输期间发送者失败时,这个超时防止客户端挂起,默认值为60000ms,即60s(也就是1分钟)。
  温馨提示:
    如果NameNode日志设置太小,就没有办法获得当前日志中进行故障排除时所需的诊断数据。大是相对的,但一般来说,250MB或更大的空间应该是理想的。     如果生产环境中集群在几个月前停止执行检查点操作,那么重启NameNode将需要处理成千上万个编辑日志段,使集群几天都不可用!     综上所述,如果由于任何原因检查点操作进程不能正常工作,可能需要做很多事情,特别是在一个繁忙的集群中。确保定期生成检查点,可以通过NameNode Web UI来查看检查点的生成时间(依次查看界面的
"Overview ","Summary","Last Checkpoint Time")。

 

三.检查点的工作机制

  检查点操作时一种资源密集型操作,它可能导致用户并发访问受限。在检查点操作期间,NameNode不允许客户端操作,例如读取和写入HDFS文件。这就是Namenode依赖Secondary NameNode或Standby Namenode来处理检查点工作的原因。

1>.使用Secondary NameNode进行检查点操作

  Secondary NameNode执行检查点操作的过程如下所示:
    (1)Secondary NameNode检查自上次执行检查点操作以来经过的时间或累计编辑次数是否满足配置的检查点阈值;
    (2)Secondary NameNode RPC调用Namenode检索最近的编辑日志事务ID;
    (3)Secondary NameNode结束当前编辑日志段,并启动新的编辑段,然后请求NameNode滚动当前编辑文件;
    (4)Namenode继续将更改写入新的编辑日志段,Secondary NameNode压缩旧的编辑日志。Secondary NameNode还获取当前fsimage文件和滚动编辑日志段的事务ID;
    (5)使用步骤4中检索的两个事务ID,Secondary NameNode对NameNode的GetImageServlet执行GET操作以获取fsimage和编辑文件;
    (6)Secondary NameNode重放编辑日志段,来捕获当前事务ID并刷新其命名空间;
    (7)Secondary NameNode将其刷新的命名空间写入新的fsimage文件;
    (8)Secondary NameNode对NameNode执行HTTP GET操作(/getimage?putimage=1)。NameNode依次对Secondary NameNode执行GET操作,并下载新的fsimage文件;
    (9)最后,NameNode用新的fsimage文件替换以前的fsimage文件,还将先前的编辑文件替换为在步骤3中创建的新编辑文件。

2>.使用Standby NameNode进行检查点操作

  如果为Namenode服务配置了高可用性,则编辑日志记录存储在Active Namenode和Standby Namenode的可访问的共享存储中。Standby NameNode不处理客户端需求,他的主要工作时通过定期执行检查点操作来保持其命名空间更新,即通过重放Active NameNode写入共享编辑目录的更改来更新fsimage。

  下面是使用Standby NameNode进行检查点操作的步骤:
    (1)Standby NameNode检查自上次执行检查点操作以来所经历过的时间或累积编辑此数是否与配置的检查点阈值相匹配;
    (2)Standby NameNode将其命名空间数据保存到fsimage.ckpt_txid新中间文件。文件名中的txid值最近的编辑日志事务的ID。
    (3)Standby NameNode向活动的NameNode发送HTTP GET消息;
    (4)活动的NameNode对Standby Namenode的GetImageServllet执行自己的GET操作。它将新检索的fsimage文件重命名为中间名称(fsimage.ckpt),为其创建MD5文件,然后将其重命名为fsimage_.xxxx。

  温馨提示:
    可以通过检查点创建具有最新命名空间的新fsimage文件与运行命令"hdfs dfsadmin -saveNameSpace"创建基本相同。
    当检查点操作正在进行时,不能故障转移到Standby NameNode或访问Stadnby Web UI。幸运的是,检查点操作持续很短的时间。

 3>.博主推荐阅读

  HDFS元数据管理实战篇:
    https://www.cnblogs.com/yinzhengjie2020/p/13363924.html

 

posted @ 2020-07-23 02:04  JasonYin2020  阅读(1151)  评论(0编辑  收藏  举报