HBase行锁RowLock源码分析(3)

hbase 事务与锁 本文档详尽的描述了 HBASE中的事务与锁等信息,是理解hbase事务与锁的好资料 立即下载

1 行锁简介

在事务特性方面,hbase只支持单row的事务,不能保证跨row(cross-row)的事务。hbase通过行锁来实现单row事务。客户端进行操作时,可以显式对某一个行加锁,但是大部分情况下是没有必要的,因为如果没有显式的加行锁,hbase在内部会默认的加行锁。为了描述方便,用户显式加的行锁简称为显式行锁。

   

源码1:客户端使用显式行锁的示例代码

HTable table = new HTable(config, tablename);

RowLock lock = table.lockRow(rowkey);//首先获得rowkey对应的行锁,可能阻塞

Put p1 = new Put(rowkey,lock);    

p1.add(cf, qua,value); //在行rowkey上,写数据

table.put(p1);

table.unlockRow(lock);//解锁

   

hbase不推荐客户端显式加行锁,因为可能造成regionserver死锁。并且现在正就"客户端不支持显式加行锁"进行讨论。

引自hbase官网:

RowLocks are still in the client API however they are discouraged because if not managed properly these can lock up the RegionServers. There is an oustanding ticket HBASE-2332 to remove this feature from the client.

   

2 实现行锁

如下图所示,客户端看到的行锁由两部分组成:rowkey和外部锁id。外部锁id是向regionserver申请行锁时,由regionserver返回的。外部锁id在对应的regionserver上全局唯一。

图1 行锁的定义

  如图2所示。一个regionserver对应一个HRegionServer实例,一个分片对应一个HRegion实例。

在HregionServer中提供两个接口lockRow和unlockRow,供客户端显式加锁和解锁。rowlocks存储了<客户端所见的锁id,内部锁id>的映射关系。因为内部锁id在分片内部是唯一的,但是在regionserver上不唯一,所以需要这个映射关系。

 在HRegion中,lockedRows记录了所有已经加锁的行,lockIds记录了映射关系<内部锁id,rowkey>。

图2

   

为了处理客户端忘记释放锁的情况,显式行锁有一个租约(即有效期,默认是60秒,可配置,对应的配置项是hbase.regionserver.lease.period),如果显式行锁超过了租约时间,regionserver会自动释放行锁。在租约时间内,如果又收到了在这个行上的写请求,会延长租约时长。

 

加显式行锁的算法

1 判断目标行是否已经加锁,如果已经加锁,则等待至解锁。

while (lockedRows.contains(row))

    lockedRows.wait();

2 分配内部锁id,记为lockId。并把映射关系<lockIds,row>加入至lockIds。lockId在region内是唯一的。

    保证内部锁id唯一性的常规的解决办法是:找出一个没有使用过的id,然后分配给行锁。hbase采用的方法比较有意思:在内部维护一个id生成器,每次分配时,把id生成器的值分配给行锁,并且id生成器自增1。如果没有出现冲突(冲突:当前分配的id不唯一),分配完成。 如果出现冲突,为id生成器赋一随机值,然后重复的上面的流程,直到没有冲突,见源码2。

    方法对比:如果使用常规方法,必然要使用到锁来进行并发控制,锁的开销还是比较大的。hbase认为出现冲突的可能性非常小,这种方法的开销应该远小于常规方法。这种提供性能的方法值得学习。

   

源码2:分配内部锁id。 见HRegion. internalObtainRowLock()

byte[] prev = null;

Integer lockId = null;

do

{

lockId = new Integer(lockIdGenerator++); //生成锁id

prev = lockIds.put(lockId, row);

if (prev != null) //如果lockId已经分配了,即发生冲突

{

lockIds.put(lockId, prev); // 恢复被破坏的映射关系

lockIdGenerator = rand.nextInt(); //生成新的锁id

}

} while (prev != null);

   

源码:添加映射关系

lockIds.put(lockId, row)

   

3 把目标行加入至lockedRows。

lockedRows.add(row);

4 为行锁分配外部锁id,这个id在regionserver内是唯一的。

    lockId = rand.nextLong(); //这种方法会给hbase带来问题,见第三节

5 在行锁上添加行锁监听器。

行锁监听器的主要功能是处理行锁的租约,租约过期时,自动释放行锁,收到新的写请求延长租约时长。

   

下图是实现行锁的类图。

图3 实现行锁类图

3 设计缺陷

在加显式行锁算法的第4步中,因为Random对象可能产生重复的值,所以分配的外部锁id可能不唯一。

通过修改regionserver的代码,模拟生成重复锁id的情况,测试流程如下:

1修改regionserver的代码使得每次分配的外部锁id都为999

2线程1为rowkey1申请行锁;线程2为rowkey2申请行锁。线程1和线程2同时并发运行。

测试发现只要只要rowkey1对应的行锁不释放,线程2会永远阻塞。

修正方法:保证外部锁id的唯一性。

AI大模型与碳足迹评估结合模式及示范案例 AI大模型与碳足迹评估相结合,可以提供更精确、更快速的碳排放量计算,优化减排策略,并促进可持续发展目标的实现。 阅读详情

相关推荐

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

本文主要介绍了如何在摩尔线程 MTT S80 上通过 Ollama 快速完成DeepSeek R1 蒸馏系列模型的推理。

摩尔线程blog中心 3595

HBase行锁

1 行锁简介 在事务特性方面,hbase只支持单row的事务,不能保证跨row(cross-row)的事务。hbase通过行锁来实现单row事务。客户端进行操作时,可以显式对某一个行加锁,但是大部分情况下是没有必要的,因为如果没有显式的加行锁,hbase在内部会默认的加行锁。为了描述方便,用户显式加的行锁简称为显式行锁。 源码1:客户端使用显式行锁的示例代码 HTabl...

weixin_30609331的博客 247

ESP32-C5 Wi-Fi CSI感知技术原理与工程实践

Wi-Fi信道状态信息(CSI)是OFDM系统中反映多径信道特性的复数频域响应,源于导频子载波的信道估计过程,本质属于物理层原始观测数据。其高维度(如56子载波)、高时间分辨率(百赫兹级采样)及零硬件增益的特性,使其成为无感人体感知的理想信号源。相比UWB或毫米波雷达,CSI方案依托现有Wi-Fi基础设施,兼具成本优势与部署灵活性,广泛应用于呼吸监测、跌倒检测、手势识别等边缘智能场景。乐鑫ESP32-C5通过5.8GHz低噪接收、亚纳秒级多天线同步与固件级CSI增强,显著提升微动感知鲁棒性,结合AGC锁定、

weixin_42153793的博客 343

hbase 总结

hbase 知识点总结

weixin_45401571的博客 1万+

六款经典限流保护电路设计:从原理到实战的完整指南

在电子系统设计中,过流保护是确保电路可靠运行的基础技术。其核心原理是通过电流采样、比较与执行三个环节构成闭环控制,将不可见的电流转化为可测量的电压信号进行处理。这项技术的核心价值在于防止因短路、堵转或异常负载导致的元器件损坏,从而提升整个系统的稳定性和安全性。在电源管理、电机驱动和精密仪器等应用场景中,限流保护电路都是不可或缺的安全屏障。本文深入解析了基于运放和晶体管搭建的经典方案,并重点探讨了采样电阻选型、参考电压生成以及PCB布局中的开尔文连接等工程实践要点,帮助读者从热门的DIY项目到工业控制都能实现

weixin_29166013的博客 351

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6150

hbase禁用一张表和把禁用的一张表恢复状态

首先需要先让该表为disable状态,使用命令: disable ‘表名’ 然后才能drop这个表,使用命令: drop ‘表名’ (注意:如果直接drop表,会报错:Drop the named table. Table must first be disabled) 但是,如果禁用一张表之后发现不想删除了,可以用enable ‘表名’ 把表的状态恢复过来。 ...

qq_38655865的博客 2718

2025实战|C#上位机+STM32实现LED串灯控制:串口通信+PWM调光+自定义帧协议(附上下位机源码)

粘包:一次收到“BRIGHT:50LED_OFF”,解析完全错乱;乱码:串口波特率/编码不匹配,指令变成“??H??50”;丢帧:数据传输中少字符,比如“BRIGHT:5”,解析出亮度5而非50。因此我们设计字节级自定义帧协议协议先行:无论简单还是复杂场景,先定义清晰的帧协议,避免数据错乱;串口稳字当头:下位机用环形缓冲区接收,上位机加锁发送,避免丢包/粘包;跨线程必处理:C#上位机所有UI更新必须用Invoke,否则必崩溃;硬件是基础:接线、供电、共地这些细节,比代码更易出问题;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 755

Hbase各级别的锁以及读写阻塞

为了保证并发操作时数据的一致性和性能,HBase中应用了各种各样高效的可重入锁,包括行级别的rowlock、mvcc,region级别的读写锁,store级别的读写锁,memstore级别的读写锁等等。 1、  行级别的锁RowLock HBase中为了解决行级别在并发操作中的一致性问题,采用了Rowlock机制。保证只有同一个线程同时对该行做操作。当然rowlock有lease租约的概念,超

u013939918的博客 1320

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 273

HBase row lock解析

行锁的使用场景 row lock,行锁,顾名思义,就是给行级的锁。那什么场景下会需要加行锁?行锁的开销如何?对性能的影响如何?如何实现的?下面我们逐个分析。 锁的产生一般都是为了做互斥或者同步,对HBase来说,各个请求之间的互斥/同步关系如下: 读读:不涉及 读写:通过mvcc保证读写的一致性 写写:094版本是互斥的,1.x系列不再互斥 写和read-and-modify:互斥...

weixin_33828101的博客 495

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

HBase行锁RowLock源码分析(1)

概论 Google在那篇著名的Bigtable论文中提到,对Bigtable一行的读写是原子的(无论涉及到几个column),这样做的好处就是简化了并发机制,用户也能很容易理解。Bigtable本来也打算实现一个通用的transaction机制,但是最终他们发现大多数用户要的其实只是基于某一行的transaction,所以实现了RowLock,这大大的简化了系统的复杂度,提高了性能。由此可以

很多时候,你缺少的不是知识而是热情 1370

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

hbase 获取行锁源码分析

17:36:47,821 WARN [RpcServer.handler=1,port=60020] retry.RetryInvocationHandler: Exception while invoking class org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.get BlockLocations. Not retrying because failovers (15) exceeded maximum

388

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HBase行锁RowLock源码分析(2)

HBase(0.89.20100726)中的RowLock使用及实现  HBase只实现了基于row-key的锁机制。  1.客户端代码    RowLock rl = table.lockRow ("test".getBytes());    Put p = new Put(rowkey, rl );    ....处理    table.unlockRow (rl);   

很多时候,你缺少的不是知识而是热情 1511

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Hbase-0.98.6源码分析--行锁

在传统的关系型数据库,如MySQL中,存在事务(Transaction)这一概念 ,事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会执行。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足ACID(原子性、一致性、隔离性

HelloWorld 636

hbase put源码分析

... try { region = getRegion(regionAction.getRegion());//获得对应操作的Region } catch (IOException e) { regionActionResultBuilder.setException(ResponseConverter.buildException(e)); responseBuilder.addRegionActionResult(regionA

242

【HBase】13-HBase行锁

像put()、 delete()、 checkAndPut(这样的修改操作是独立执行的,这意味着在一个行方式的执行中,对于每一行必须保证行级别的操作是原子性的。 region服务器提供了一个行锁( row lock)的特性,这个特性保证了只有一个客户端能获取一行数据相应的锁,同时对该行进行修改。在实践中,大部分客户端应用程序都没有提供显式的锁,而是使用这个机制来保障每个操作的独立性。 用户应该尽可...

通往神秘的道路的专栏 1263

hbase的行锁与多版本并发控制(MVCC)

参考:http://www.rigongyizu.com/hbase-row-lock-and-multiversion-concurrency-control/   MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来...

SAN_YUN的专栏 598

OpenClaw自定义MCP服务器配置实战:从原理到部署完整指南

MCP(Model Context Protocol)作为一种标准化的AI工具接入协议,其核心价值在于实现AI平台与外部工具的解耦与标准化集成。通过定义统一的通信规范,MCP使得开发者只需实现一次服务器,即可让支持该协议的AI平台(如OpenClaw、Cursor等)直接调用,极大扩展了AI的能力边界。在工程实践中,配置自定义MCP服务器涉及环境准备、服务器部署、安全管控等多个环节,其中正确处理环境变量和命令行参数是确保服务稳定运行的关键。本文以OpenClaw平台为例,深入解析如何配置Tavily搜索、本

weixin_33695082的博客 592

Hbase报错解决方法ERROR: KeeperErrorCode = NoNode for /hbase/master

hbase放了一段时间之后,发现运行命令时报NoNode for /hbase/master异常,其他如create等等命令也是如此,详细报错信息如下: hbase(main):005:0&gt; status ERROR: KeeperErrorCode = NoNode for /hbase/master For usage try 'help "status"' Took 8.176...

巨魔战将 7万+

HBase创建表已经存在,删除表又不存在的问题

清除Zookeeper内存数据库中的相关数据 [root@node1]# zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper, hadoop-ha, hbase] [zk: localhost:2181(CONNECTED) 1] ls /hbase [replication, meta-region-server, rs...

夜下探戈 1755

HBase 创建表已经存在,删除表又不存在的问题

1. 创建表,提示已经存在[root@node1]# hbase shell 2017-04-07 14:13:46,230 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

程裕强的专栏 5637

HBase 创建表已经存在,删除表又不存在的问题的两种解决方法

错误提示信息: 用list 查看student表 发现没有student表的信息 通过Web Console 查看表的信息 也没有表的任何信息 用scan 查看student表,发现也没有任何的信息 通过以上的尝试,现在只能查看ZooKeeper中student的注册信息 方法一: 使用zookeeper-dev-ZooInspector.jar工具查看ZK的...

liuzhuang2017的博客 5807

hbase集群部分异常问题解决

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33928467的博客 2148
上一篇: HBase行锁RowLock源码分析(2)
下一篇: DBA生存之四大守则
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值