HDFS租约机制

来源:互联网 发布:磐石软件 编辑:程序博客网 时间:2024/05/24 06:14

HDFS中,当一个客户端往HDFS某个文件写入数据的时候,为了保持数据的一致性,其他客户端是不允许同时写入的。为了实现这一机制,HDFS引入了租约的概念。简而言之,租约是HDFS 给与客户端可以写入某个文件的临时许可证,没有此证件或者租约到期都不能继续向该文件写入数据。

一 租约的属性或者要素:

1、租约持有者(holder):一般是指客户端,每一个客户端持有一个租约。

2、租约对应的文件列表:一个客户端的所持有的租约允许对应多个文件id列表,表示这个客户端可以同时对多个文件进行操作。

3、最近更新时间:以此决定租约是否过期。

 

二 HDFS中租约的管理

比如租约的添加移除或者客户端操作完毕未及时释放租约,HDFS的处理流程,过期的租约是怎么处理的等。这些操作都是在租约管理器中实现的LeaseManager.

LeaseManager由于是要对外提供服务的,所以毫无疑问它属于Active

NameNode运行的服务,

2.1作用

1、维护租约持有者和租约的映射关系

2、维护文件路径和租约的映射关系

 

3、提供租约增删改查方法

4、维护一个监视器进程,定期检查租约是否到期或者超时,对于长时间没有更新租约的文件(硬时间限制),就会触发租约恢复机制

 

2.2添加租约-addLease

HDFS客户端在写文件的时候,需要申请租约,根据holder去获取租约,如果没有获取到,则创建一个租约,然后更新租约和租约持有者的信息;如果已经存在,可以先从租约持有者和租约映射关系移除,

且需要从文件列表移除,在添加新的租约,然后更新对应的映射关系

 

2.3租约检查-FSNamesystem.checkLease

当客户端放弃申请到的数据块或者上一次申请的数据块用完了,现在申请新的数据块,那么都需要检查租约。

如果HDFS文件不存在,或者是一个目录,或者已经被删除,或者正处于构建中,则抛出异常。

2.4租约更新-renewLease

根据以更新时间排序的租约集合中删除当前租约,再更新这个租约的最新更新时间,再次加到租约集合中

 

2.5删除租约

NameNode关闭构建中的文件,将文件构建状态转变为非构建状态,同时由于客户端已经完成了写操作,所以需要删除租约。

 

三 租约检查机制

租约管理器会定期对租约进行检查,对于长时间没有进行租约更新的文件,会对这个文件进行租约恢复,然后关闭这个文件。

什么时候会出现租约过期呢?比如HDFS出现故障,客户端和可能在打开一个文件之后出现故障,造成客户端不能玩成租约更新以及租约的删除操作,这就造成逐月过期。

 

定期检查是由内部的Monitor内部类负责的,每个2s就会运行一次,调用一次LeaseManager.checkLeases()方法。

首先遍历所有租约

然后:如果没有超过硬时间限制则直接返回

再次:是对过期租约取出对应的文件,然后对文件租约进行恢复

最后:需要在editlog中同步恢复记录