leaseManager詳解
簡(jiǎn)介
HDFS作為一個(gè)分布式文件系統,只允許一個(gè)客戶(hù)端同時(shí)對一個(gè)文件進(jìn)行修改操作。租約就是為了實(shí)現獨占的寫(xiě)操作的機制。
HDFS租約的主要實(shí)現類(lèi)是LeaseManager。
Lease 的使用場(chǎng)景如下:
- 客戶(hù)端在申請創(chuàng )建新的文件或者向文件追加都會(huì )先向NameNode申請獲得inode或者最后一個(gè)塊的信息
- 在NameNode中FSNamesystem會(huì )調用recoverLeaseInternal檢查文件是否是UnderConstruction,是UnderConstruction的前提下,在leaseManager中是否這個(gè)client已經(jīng)持有租約,如果有則拋出已經(jīng)持有租約的異常
- 再檢查文件的原來(lái)的租約持有者的的租約是否超過(guò)了軟限制,如果超過(guò)了軟限制則執行租約恢復internalReleaseLease進(jìn)行租約恢復。
- 因為在文件是UnderConstruction前提下檢查,文件必定有一個(gè)租約持有者,所以,直接拋出已經(jīng)有另一個(gè)租約持有者的異常。
- 如果文件不是在UnderConstruction狀態(tài),則直接為這個(gè)發(fā)起請求的客戶(hù)端構造租約,加入到LeaseManager的租約維護的集合中。
- 在NameNode中租約持有者DFSClient并不是DFSClient類(lèi),而是clientName,他的生成規則如下
# 其中dfsClientConf.taskId是mapreduce.task.attempt.id 配置獲取默認為NONMAPREDUCE
clientName = "DFSClient_" + dfsClientConf.taskId + "_" + DFSUtil.getRandom().nextInt() + "_" + Thread.currentThread().getId();
leaseManager
-
軟限制 & 硬限制
- 軟限制是能容忍的客戶(hù)端刷新租約的最長(cháng)時(shí)間限制,為60s不可更改,如果客戶(hù)端的租約超過(guò)60s未更新,則其他客戶(hù)端請求文件就可以執行租約恢復操作
- 硬限制就是namenode能容忍的文件最長(cháng)不放開(kāi)租約的時(shí)間,在超過(guò)軟限制后,并沒(méi)有客戶(hù)端請求更改文件導致沒(méi)有觸發(fā)租約恢復,那么只能等待LeaseManager的周期線(xiàn)程檢查這個(gè)超過(guò)這個(gè)時(shí)限的租約強制進(jìn)行租約恢復?;謴偷慕巧矔?huì )變成namenode。
-
LeaseManager 主要用戶(hù)租約的管理,其實(shí)就是保存 用戶(hù) + 文件 + 租約的集合,LeaseManager內部的集合有2個(gè)(Hadoop 3.3.1版本)
- leases:為一個(gè)map,記錄clientName 對應的Lease。
- leasesById:以路徑字典序保存了文件的nodeId與租約的對應關(guān)系,用來(lái)其他類(lèi)快速獲取UnderConstruction的文件。
-
用戶(hù)為DFSClient 索引者一個(gè)租約,一個(gè)租約下面掛載了多個(gè)文件,也就是說(shuō)一個(gè)客戶(hù)端操作多個(gè)文件租約還是同一個(gè)。
-
內部線(xiàn)程周期調度檢查是否超出硬限制,如果超過(guò)硬限制,則將該租約下的所有文件都執行租約恢復,恢復的執行者為HDFS_NameNode。

0 評論