[DN优化] [锁优化] [HDFS-15150] Introduce read write lock to Datanode

博客介绍了在Hadoop中,为了优化性能,将全局的排它锁(ReentrantLock)替换为读写锁(ReentrantReadWriteLock)。改动包括将datasetLock替换为datasetWriteLock和datasetReadLock,并在代码中相应地使用写锁。虽然目前所有访问都使用写锁,行为与原锁相同,但这作为拆锁的第一步,为后续引入读锁以提高并发读性能铺平道路。改动已通过单元测试,但必须配合后续补丁才能实现性能提升。

分析

背景:DN性能优化的一部分
目标:AutoCloseableLock 改为 ReadWriteLock

知识回顾:假设在程序中定义一个共享的数据结构,它大部分时间提供读服务,而写操作占有的时间很少,但是写操作完成之后的更新需要对后续的读服务可见。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。

ReentrantReadWriteLock的实现里面重要特性:1、公平性:非公平锁(默认):非公平锁的吞吐量要高于公平锁。(公平锁概念:公平锁利用AQS的CLH队列,释放当前保持的锁时,优先为等待时间最长的那个写操作分配写入锁)

代码实现

Hadoop自定义实现了一套支持try-with-resource的锁。如下:

public class AutoCloseableLock implements AutoCloseable {
   
   

  private final Lock lock;
  public AutoCloseableLock() {
   
   
    this(new ReentrantLock());
  }

  
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 的状态。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值