Hadoop的租约机制

租约的概念

HDFS有一个内部机制,不允许客户端并行写入,即同一时刻,不允许有多个客户端向一个HDFS上写数据。
要实现该需求,第一反应是采用互斥锁,但是如果底层真的采用简单的互斥锁,可能会因为网络问题,造成客户端不释放锁,从而引起死锁问题。因此HDFS引入了租约机制。
客户端在每次读写HDFS文件的时候获取租约对文件进行读写,文件操作完成后,释放此租约。

租约内部结构如图所示:

Hadoop的租约机制_第1张图片

  • 每个客户端用户持有一个租约
  • 每个租约内部包含1个租约持有者的信息,还有此租约对应的文件id列表,表示当前租约持有者正在写这些文件id对应的文件
  • 每个租约包含有一个最新的更新时间,最新更新时间将会决定此租约是否过期,过期的租约会导致租约持有者无法继续执行写数据到文件中,除非进行租约的更新。

LeaseManager租约管理器

HDFS的租约管理器集中在一个类上:LeaseManager。它与CacheManager(缓存管理类),SnapshotManager(快照管理类)类似,是一个中心管理类,运行在ActiveNameNode的服务上。在LeaseManager租约管理器中,做的事主要归纳为两类:
1.维护HDFS内部当前所有的租约,并以多种映射关系进行保存,保存的映射关系有一下3种:

  • 租约持有者对租约的映射关系
  • 文件id对租约的映射关系
  • 按照时间排序进行租约集合的保存(非映射关系)

2.定期释放过期的租约
在某些异常情况下,客户端可能在写文件之后没有正常关闭文件,导致文件始终处于写的状态,此文件在对应的租约中没有被真正的移除。
对此,Lease Manager中的解决方案是启动一个定时监控的线程来释放过期的租约,租约检测的操作如下:

  • 1.获取最老的已经过期的租约
  • 2.得到此租约中保存的文件id
  • 3.关闭这些文件id对应的文件,并将这些文件id从此租约中移除
  • 4.如果此租约中已经没有打开的文件id,则将此租约从系统中移除

LeaseRenewer租约更新器

LeaseRenewer对象的作用在于定时更新DFSClient用户所持有的租约,每个用户对应一个LeaseRenewer更新器对象,每个LeaseRenewer对象内部会维护一个DFSClient客户端列表。
在LeaseRenewer主方法中,会定期执行DFSClient客户端对应租约的renew操作,当DFSClient端所操作的文件都已经关闭,DFSClient将从LeaseRenewer的客户端列表中进行移除,意味着此DFSClient所对应的租约将不再进行更新,最后会被LeaseRenewer移除。

你可能感兴趣的:(hadoop)