Lease 介绍(租约锁)---HDFS控制并发写入情况

Lease 介绍(租约锁)

HDFS不支持文件修改以及不支持并行写操作。在实际生产环境中,HDFS可能同时有多个用户(多个客户端)同时执行文件写/上传操作(hadoop fs -put xxx /xxx )。所以,hadoop需要采取一些措施来控制并发写入情况的发送。最开始的设计思路是:用互斥锁来实现。即某一个时刻,只有拿到互斥锁的客户端能够执行写操作。但是,互斥锁在分布式系统中会有很多问题。

问题一:客户端每次执行写入时,都需要向namenode申请互斥锁,这样会增加不必要的网络通信开销,浪费宝贵的网络带宽资源。
问题二:假如某个客户端拿到互斥锁之后,失去了和namenode的联系,则可能会出现此客户端的持有的互斥锁永不释放的情况,造成死锁。从而造成其他客户端的操作被终止。

HDFS采用了租约机制(Lease),Lease说白了就是一个有时间约束的互斥锁,即某一个客户端成功拿到租约锁后,在租约有效时间内,此客户端一直持有文件写权限。(其他客户端等待)

即客户端执行写操作时,会向namenode申请一个Lease,Lease是由org.apache.hadoop.hdfs.server.namenode.LeaseManager来管理的。比如 用户:zhangsan ;上传的文件:1.txt;申请到的Lease对象:L1
LeaseManager的作用之一是维护:文件 ——Lease 的关系 即 1.txt——L1的关系;用户——Lease的关系zhangsan ——L1的关系。

租约过期后,如果此客户端的文件还没写完,则向NameNode申请续约。
此外,如果此客户端在租约的有效期间内,客户端发生了异常,和NameNode失去了联系,当租约期满后, NameNode会发现发生异常的客户端,此时NameNode会将新的租约赋给其它正常的客户端,而发生异常的客户端已经写入的那部分数据会根据其对应的数据版本号被安全删除掉。

在LeaseManager这个类有两个变量:softLimit和hardLimit,用long来约定两个时间期限。这两个变量的意思分别是:软限制和硬限制。

softLimti的释义:比如申请一个租约时间是 10s,softLimit是3s,如果一个客户端上传一个文件,已经用时10s,但还没上传完,那还可以再用时3s来继续上传,如果过来3s之后还没上传完,就申请续约(再申请10s的租约)。

在LeaseManager这个类里有一个Monitor线程,这个线程会周期性检查(hardLimit)是否过期。如果过期,就强制收回租约,并分配给另一个新的客户端。hardLimit释义:比如申请一个租约时间是10s,hardLimit是3s。如果一个客户端上传一个文件,用时2s就传完了,文件的输出流close。close之后过了3s,(此时租约还有5s未用完)namenode强制收回租约,交给其他新的客户端。

你可能感兴趣的:(大数据,HDFS)