无情 @ 2019-08-09 10:07:16 阅读(992)
hadoop hdfs


一、什么是租约

租约(Lease)是一种广泛应用与分布式系统领域的协议,主要用来维护分布式系统的一致性

 

HDFS中,当每次客户端用户往某个文件中写入数据的时候,为了保持数据的一致性,此时其它客户端程序是不允许向此文件同时写入数据的。那么HDFS是如何做到这一点的呢?答案是租约(Lease)。换句话说,租约是HDFS给予客户端的一个写文件操作的临时许可证,无此证件者将不被允许操作此文件。

 

二、HDFS租约模型和内部机制

 

HDFS租约的相关定义

1:每个客户端用户持有一个租约

2:每个租约的保护持有者信息,还有此租约对应的文件Id列表,表示当前租约持有者正在写这些文件Id对应的文件

3:每个租约内包含有一个最新近更新时间,最近更新时间将会决定此租约是否已过期。过期的租约会导致租约持有者无法继续执行写数据到文件中,除非进行租约的更新

 

 

 

LeaseManager  LeaseManager是租约的管理者,运行于HDFS-Server端,其主要功能特性有

  维护了DFSClientLease的映射关系

  维护了filePathLease的映射关系

  对租约进行生命周期和状态的管理:

    创建租约或正常情况下的销毁租约

    赋予(或撤销)FilePath权限给租约

    接受续约请求,对租约进行续约处理

    对超过hardLimit的租约进行销毁处理

 

dfs.namenode.lease-recheck-interval-ms 默认值 2000

 

这个监听任务每隔2s执行一次检查

 

 

满足一下3个条件,则进入租约释放操作

1、如果租约队列不为空

2、租约队列中最老的租约已经出现了超时 (这个就是我们所说的  “硬限制则”  是考虑到文件close时未来得及释放lease的情况强制回收租约 1个小时)

3、没到租约检测的最大时间期限 dfs.namenode.max-lock-hold-to-release-lease-ms 默认 25

计算公式 monotonicNow() - start > 25 dfs.namenode.max-lock-hold-to-release-lease-ms 

 

 

总结

 

softLimit期限内,该客户端拥有对这个文件的独立访问权,其他客户端不能剥夺该客户端独占写这个文件的权利。

softLimit过期后,任何一个客户端都可以回收lease,继而得到这个文件的lease,获得对这个文件的独占访问权。

hardLimit过期后,namenode强制关闭文件,撤销lease

软租约每隔60s就失效,

判断软件租约的逻辑

 

lastUpdate 有客户端每隔1s更新一次

softLimit :值是60 * 1000 1分钟

 

 

 

 

 

三、总结lease流程

 

 

补充一点:

clientName的生成逻辑

如: DFSClient_NONMAPREDUCE_-1110465581_12

 

源码 :clientName "DFSClient_" dfsClientConf.taskId "_" + DFSUtil.getRandom().nextInt()  + "_" + Thread.currentThread().getId();  也就是lease模型的holder里面的