[DN优化] [锁优化][HDFS-15160] ReplicaMap, Disk Balancer and others use datanode readlock

背景

现在我们已经引入了HDFS-15150,我们可以开始改进一些DN操作来使用读锁而不是写入锁来提高并发。

第一步是对Replicamap进行更改

- ReplicaMap:一些方法会调用`replicmap .replicas()`(例如`getBlockReports`, `getFinalizedBlocks`, `deepCopyReplica`),并且只以只读方式使用,所以它们也可以切换到使用readLock。

接下来是目录扫描仪和磁盘均衡器,只需要读锁。

- `Disk Balancer`, `Directory Scanner`: Next is the directory scanner and disk balancer, which only require a read lock.

最后,FSDATASETIMPL在那里它相当明显,他们只需要读锁。

- BlockSender and fsdatasetImpl: where is it fairly obvious they only need a read lock.

分析

(1)ReplicaMap该类维护副本的集合

- ReplicaInfo get(String bpid, long blockId) 方法写锁改为读锁
- int size(String bpid)方法写锁改为读锁
其他写相关依旧使用写锁

(2)DiskBalancer

- private Map<String, String> getStorageIDToVolumeBasePathMap() 锁改为读锁

(3)FsDatasetImpl

- public FsVolumeImpl getVolume(final ExtendedBlock b)写锁改为读锁
- public Block getStoredBlock(String bpid, long blkid)写锁改为读锁
- public Set<? extends Replica> deepCopyReplica(String bpid)写锁改为读锁
- public ReplicaInputStreams getTmpInputStreams 写锁改为读锁
- public ReplicaInfo moveBlockAcrossStorage 写锁改为读锁
- getBlockReports ...
- 其他方法

(3)BlockSender

配置

增加一项配置:开关 dn hdfs-site.xml中配置

<name>dfs.datanode.lock.read.write.enabled</name>
<value>true</value>

默认打开,如果开启则使用读写锁,如果关闭,所有的锁都是写锁。
FsDatasetImpl中

boolean enableRL = conf.getBoolean(
    DFSConfigKeys.DFS_DATANODE_LOCK_READ_WRITE_ENABLED_KEY,
    DFSConfigKeys.DFS_DATANODE_LOCK_READ_WRITE_ENABLED_DEFAULT);
// The read lock can be disabled by the above config key. If it is disabled
// then we simply make the both the read and write lock variables hold
// the write lock. All accesses to the lock are via these variables, so that
// effectively disables the read lock.
if (enableRL) {
  LOG.info("The datanode lock is a read write lock");
  this.datasetReadLock = new AutoCloseableLock(datasetRWLock.readLock());
} else {
  LOG.info("The datanode lock is an exclusive write lock");
  this.datasetReadLock = this.datasetWriteLock;
}
测试
  • 单元测试通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值