HDFS——块汇报

Posted hncscwc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS——块汇报相关的知识,希望对你有一定的参考价值。

在一文中,讲述了HDFS的写文件流程。


来考虑这么一个问题,客户端在申请block时,是否可以连续多申请几个block,然后对不同的block并发写,以提升写的速度


答案是不行的。因为在NN内部,对同一个文件,申请block时,会检测之前block是否达到指定状态,如果没有达到指定状态,申请block失败。


因此,对于客户端而言,无法同时申请多个block写。而NN感知block的状态得益于DN的块汇报逻辑。本文就来聊聊DN的块汇报。


【块汇报介绍】


在DN中,块汇报分为全量块汇报(Full Block Report,简称FBR)和增量块汇报(Incremental Block Report,简称IBR)。


全量块汇报,顾名思义,就是将DN中存储的所有block信息都汇报给NN。


通常,DN中都存储一定数量级的block,全量汇报时,耗时会相对更长,发送的数据也会更多。因此,全量块汇报的时间间隔相对也会更长,间隔时间可配置,默认间隔为6小时。


由于全量块汇报的时间间隔很长,那么在这期间的block信息变更要通知到NN,这就是增量块汇报的逻辑了。


当block块的状态发送变更时,DN就会触发发送增量块汇报信息给NN。增量块汇报的时间间隔也是可以配置的,默认间隔为0。即一旦触发增量块汇报,就立即发送。如果大于0,则按间隔时间发送增量块汇报。


在DN内部,块汇报(不管是全量还是增量)都是在心跳线程中发送的。心跳线程的处理逻辑,大概如下图所示:



  • 在心跳线程中,首先判断是否到达下次心跳时间(当前时间距离上次心跳时间超过心跳间隔),如果是则发送心跳,并从心跳结果中处理NN发送过来的命令。

  • 接着判断是否需要发送增量块汇报,其判断依据是:有block信息变更并且达到下次增量块汇报时间(当前时间距离上次增量块时间超过指定间隔)或者该次循环需要发送心跳(沿用上一步骤的判断结果),两者满足其中一个,则发送增量块汇报

  • 接着再判断是否需要发送全量块汇报,如果是则发送全量块汇报,然后处理全量块汇报中NN发送过来的命令。

  • 最后睡眠一段时间(距离最近一次增量块汇报时间或心跳时间),然后循环上面的处理逻辑。


由此可见,增量块汇报的发送其实还受心跳间隔的影响。也就是说,心跳超时会触发发送增量块汇报,但反过来,增量块汇报超时不会触发发送心跳,而是仅发送增量块汇报。


【增量块汇报时机】

前面提到了,block信息变更时会触发增量块汇报。那么具体是哪些场景,哪些变更会触发增量块汇报呢?


从源码中了解到,这三种block状态变化会触发发送增量块汇报。


  • RECEIVING_BLOCK:正在接收的块

    主要为客户端创建文件或追加写文件后,DN收到客户端的block传输的请求后,block状态为正在接收。


  • RECEIVED_BLOCK:已经接收完成的块

    这个也好理解,DN接收完一个block后,block状态变为已经接收完成。


  • DELETED_BLOCK:已经删除的块

    例如,DN定时目录扫描发现内存中记录有block信息,但实际磁盘中却缺少对应的block文件(可能因为磁盘异常,或人为删除),因此通过增量块汇报上报NN。


【全量块汇报】

前面讲到了DN全量块汇报时,其数据量会很大,并且由于NN处理全量块汇报时会进行全局锁。因此在处理DN全量块汇报时,会导致持续占有锁,从而引起客户端的请求操作因等锁而响应慢,甚至超时(这里不展开说明,后续再单独讲)


基于此,DN在进行全量块汇报时,会有一些优化处理。


全量块汇报分批发送

DN在进行全量块汇报时,如果其block总数超过了设定的阈值(可配置,默认100w),就拆分成多条汇报,每次汇报一个存储目录下的block信息。简单来说,就是将一条消息拆分成了多条消息发送。


租约机制

每当需要进行全量块汇报时,DN先通过心跳向NN请求获取租约ID。NN处理心跳时,发现DN请求全量块汇报,进而可以根据自身繁忙程度决定是否允许DN进行全量块汇报。如果可以,则返回一个租约ID。


DN在全量块汇报中需要同时携带该租约ID,才能真正被NN处理。另外,该租约ID是有时效性的,超过有效性发送的全量块汇报,NN将不会进行处理。


通过这两个细节处理,可以一定程度缓解NN因处理全量块汇报而持续占有锁的问题。


【相关配置汇总】

# IBR汇报时间间隔dfs.blockreport.incremental.intervalMsec
# FBR汇报时间间隔dfs.blockreport.intervalMsec
# DN启动后首次进行FBR的延迟时间dfs.blockreport.initialDelay
# FBR汇报的block数阈值dfs.blockreport.split.threshold
# NN中允许同时进行FBR的个数dfs.namenode.max.full.block.report.leases
# FBR的租约有效期dfs.namenode.full.block.report.lease.length.ms


【总结】


本文总结了DN中块汇报的相关知识,包括全量块汇报、增量块汇报的时机;心跳线程中发送块汇报的流程;增量块汇报的触发的条件,以及全量块汇报的一些细节。


好了,本文就介绍到这里了,原创不易,点赞,在看,分享是最好的支持, 谢谢~




以上是关于HDFS——块汇报的主要内容,如果未能解决你的问题,请参考以下文章

HDFS源码分析心跳汇报之数据块增量汇报

HDFS——块汇报

HDFS基础

HDFS的工作流程

hdfs原理之四大机制

HDFS高级功能