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

本文介绍了HDFS中为提高并发性能而进行的锁优化,涉及ReplicaMap、DiskBalancer和FsDatasetImpl等组件。通过对只读操作使用读锁,减少了写锁的使用,从而提升了数据节点的操作并发性。改动包括修改相关方法的锁类型,并添加配置选项以控制读写锁的启用。所有改动经过单元测试验证,确保了系统的稳定性和性能提升。

背景

现在我们已经引入了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该类维护副本的集合

- 
Hadoop 分布式文件系统(HDFS)中,`hdfs --daemon start namenode`、`hdfs --daemon start datanode` 和 `hdfs --daemon start secondarynamenode` 是用于启动 HDFS 中不同守护进程的命令。 以下是每个命令的作用以及如何通过代码实现这些功能的详细说明: ### 1. **启动 NameNode** - NameNode 是 HDFS 的核心组件之一,负责管理文件系统的命名空间和客户端对文件的访问。 - 启动 NameNode 的命令: ```bash hdfs --daemon start namenode ``` #### 解释 - `--daemon start`:表示以守护进程的方式启动服务。 - `namenode`:指定启动的是 NameNode 服务。 ### 2. **启动 DataNode** - DataNode 负责存储实际的数据块,并根据 NameNode 的指示执行数据的读写操作。 - 启动 DataNode 的命令: ```bash hdfs --daemon start datanode ``` #### 解释 - `datanode`:指定启动的是 DataNode 服务。 ### 3. **启动 SecondaryNameNode** - SecondaryNameNode 并不是 NameNode 的热备份,而是定期合并 NameNode 的元数据文件(fsimage 和 edits 日志),以防止元数据文件过大。 - 启动 SecondaryNameNode 的命令: ```bash hdfs --daemon start secondarynamenode ``` #### 解释 - `secondarynamenode`:指定启动的是 SecondaryNameNode 服务。 --- ### 示例代码:检查 HDFS 守护进程状态 以下是一个简单的 Bash 脚本,用于检查 HDFS 的 NameNode、DataNode 和 SecondaryNameNode 是否正在运行: ```bash #!/bin/bash # 检查 NameNode 状态 if pgrep -fl "NameNode" > /dev/null; then echo "NameNode is running." else echo "NameNode is not running." fi # 检查 DataNode 状态 if pgrep -fl "DataNode" > /dev/null; then echo "DataNode is running." else echo "DataNode is not running." fi # 检查 SecondaryNameNode 状态 if pgrep -fl "SecondaryNameNode" > /dev/null; then echo "SecondaryNameNode is running." else echo "SecondaryNameNode is not running." fi ``` ### 解释 - `pgrep -fl "NameNode"`:使用 `pgrep` 命令查找当前系统中是否运行了 NameNode 进程。如果找到,则输出“NameNode is running.”;否则输出“NameNode is not running.”。 - 类似地,可以检查 DataNode 和 SecondaryNameNode 的状态。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值