Standby Namenode(sbn)在进入standby状态后对FSNamesystem调用startStandbyServices(final Configuration conf),该方法会建立两个重要的对象:EditLogTailer 和 StandbyCheckpointer,前者有两个功能:node
后者有三个功能:apache
对namespace进行checkpointoop
清理陈旧的fsimage文件和edits文件(sbn并不会将拉取的edit log保存到磁盘,因此就不存在清理。nn将edit log写到本地和JournalNodes,因此就涉及到陈旧edits文件的清理),详细清理过程后续博客会继续分析。spa
上传新checkpoint出的fsimaeg文件到nn.net
StandbyCheckpointer内部维护一个CheckpointerThread线程,该线程负责周期性检查checkpoint条件是否知足,若是知足就进行checkpoint。线程
检测周期(checkpointPeriod):1000*Math.min(dfs.namenode.checkpoint.period, dfs.namenode.checkpoint.check.period)秒code
条件1:最近一次合并到namespace的edit log的 txid 和最近一次作了checkpoint的txid的差值大于或者等于dfs.namenode.checkpoint.txns配置的数量(默认1000000)对象
条件2:当前时间距离最近一次checkpoint的时间间隔大于或者等于dfs.namenode.checkpoint.period (默认3600秒)blog
CheckpointerThread每隔checkpointPeriod 秒检查一次。优先检查条件1是否知足,若是知足就进行checkpoint,不然检查条件2,若是条件2知足就进行checkpoint,不然就等待下一个检查周期。一旦条件知足,就进入doCheckpoint()方法进行checkpoint,流程以下: 接口
checkpoint过程本质就是将维护在内存中的namespace全量inode树导出到磁盘保存为fsimage_txid文件,并生成fsimage_txid文件的md5保存到fsimage_txid.md5文件。考虑到磁盘故障等问题,sbn 和 nn均可以配置多个目录保存fsimage文件和edits文件【一般建议将fsimsge和edits分开保存到不一样磁盘,这样能够缓解磁盘压力,毕竟运行中的nn会频繁刷editlog到磁盘,checkpoint也会写大文件到磁盘】,因此就须要将fsimage导出到多个目录。导出过程由FSImageSaver完成,FSImageSaver实现了Runnable接口,内部根据_Protocol Buffer_定义好的fsimage的数据格式和压缩格式将namespace写入fsimage_txid.ckpt文件,写入完成后再将此文件重名字为fsimage_txid文件,并生成文件的md5码保存到fsimage_txid.md5文件。对应于每一个保存目录都会建立一个线程和一个FSImageSaver对象,多个目录并行导出。
待新的fsimage文件生成以后,sbn会将磁盘上保留的陈旧的fsimage文件清理掉。历史fsimage文件一般只会在元数据损坏的时候被用来作恢复用,适当保留几份就够了,太多了不只没用反而浪费磁盘空间。有关清理过程,后续会分析。
最后一步,sbn将新的fsimage文件上传给nn,这也是sbn除ha外的另外一个存在乎义。为了在文件传输过程当中也能快速完成transition to active(HDFS-4816),StandbyCheckpointer会单独启动一个线程,在其内部由TransferFsImage用http协议(nn 用jetty维护了一个ImageServlet 用于 fsimage文件的上传、下载)完成fsimage传输。
涉及到的几个重要参数:
参数名称 | 说明 | 默认值 |
---|---|---|
dfs.namenode.checkpoint.period | checkpoint的时间间隔 | 3600(秒) |
dfs.namenode.checkpoint.check.period | 检查周期 | 60(秒) |
dfs.namenode.checkpoint.txns | 两次checkpoint间的txid数量,超过该值就应该checkpoint | 1000000 |
dfs.image.compress | 是否压缩生成的fsimage文件 | false |
dfs.image.compression.codec | 压缩格式 | org.apache.hadoop.io.compress.DefaultCodec |
前三个参数关系到checkpoint的频率,若是过于频繁会致使频繁上传fsimaeg文件、频繁写磁盘,给nn形成压力,影响正常服务。若是频率低,则会致使过多事务得不到持久化,最终nn重启时间延长,sbn也就失去了意义。