参考:http://www.rigongyizu.com/hbase-row-lock-and-multiversion-concurrency-control/
MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。
HBase正是通过行锁+MVCC保证了高效的并发读写。
为什么需要并发控制
HBase系统本身只能保证单行的ACID特性。ACID的含义是:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
传统的关系型数据库一般都提供了跨越所有数据的ACID特性;为了性能考虑,HBase只提供了基于单行的ACID。
下面是一个hbase并发写的例子。
原始数据如下
从Apache HBase Write Path一文可以知道hbase写数据是分为两步:
1. 写Write-Ahead-Log(WAL)文件
2. 写MemStore:将每个cell[(row,column)对]的数据写到内存中的memstore
写写同步
假定对写没有采取并发控制,并考虑以下的顺序:
最终得到的结果是:
这样就得到了不一致的结果。显然我们需要对并发写操作进行同步。
最简单的方式是提供一个基于行的独占锁来保证对同一行写的独立性。所以写的顺序是:
- (0) 获取行锁
- (1) 写WAL文件
- (2) 更新MemStore:将每个cell写入到memstore
- (3) 释放行锁
读写同步
尽管对并发写加了锁,但是对于读呢?见下面的例子:
如果在上面的图中红线所示的地方进行读操作,最终得到的结果是:
可见需要对读和写也进行并发控制,不然会得到不一致的数据。最简单的方案就是读和写公用一把锁。这样虽然保证了ACID特性,但是读写操作同时抢占锁会互相影响各自的性能。
MVCC算法
HBase采用了MVCC算法来避免读操作去获取行锁。
对于写操作:
- (w1) 获取行锁后,每个写操作都立即分配一个写序号
- (w2) 写操作在保存每个数据cell时都要带上写序号
- (w3) 写操作需要申明以这个写序号来完成本次写操作
对于读操作:
- (r1) 每个读操作开始都分配一个读序号,也称为读取点
- (r2) 读取点的值是所有的写操作完成序号中的最大整数(所有的写操作完成序号<=读取点)
- (r3) 对某个(row,column)的读取操作r来说,结果是满足写序号为“写序号<=读取点这个范围内”的最大整数的所有cell值的组合
在采用MVCC后的数据执行图:
注意到采用MVCC算法后,每一次写操作都有一个写序号(即w1步),每个cell数据写memstore操作都有一个写序号(w2,例如:“Cloudera [wn=1]”)),并且每次写操作完成也是基于这个写序号(w3)。
如果在“Restaurant [wn=2]” 这步之后,“Waiter [wn=2]”这步之前,开始一个读操作。根据规则r1和r2,读的序号为1。根据规则3,读操作以序号1读到的值是:
这样就实现了以无锁的方式读取到一致的数据了。
重新总结下MVCC算法下写操作的执行流程:
- (0) 获取行锁
- (0a) 获取写序号
- (1) 写WAL文件
- (2) 更新MemStore:将每个cell写入到memstore
- (2a) 以写序号完成操作
- (3) 释放行锁
本文是基于HBase 0.92. 在HBase 0.94中会有些优化策略,比如 HBASE-5541 提到的。
英文原文:https://blogs.apache.org/hbase/entry/apache_hbase_internals_locking_and
相关推荐
3. **线程安全与并发控制**:在多线程环境下,需要特别注意并发问题。HBase客户端提供了`HTableInterface`的原子操作,如`put`和`checkAndPut`,确保了多线程环境下的数据一致性。然而,对于自定义的多线程操作,...
Hive 1.x版本与HBase 0.98.x或更低版本兼容,而Hive 2.x版本则兼容HBase 1.x及更高版本。用户应确保选择兼容的HBase和Hive版本进行部署,以避免潜在的集成问题。 4. HBase与ZooKeeper的版本兼容性: ZooKeeper是...
行键是唯一的,列族下可以有多个列,每个列都有一个时间戳,这使得多版本并发控制成为可能。 4. **Region划分**:为了提高读写性能,HBase将表分成多个Region。Region会根据行键的范围进行划分,并且可以自动分裂和...
HBase还支持多版本并发控制(MVCC),这种机制允许多个版本的数据项并存,通常用于实现读写一致性。 Google Percolator是一种为了解决大规模数据上增量处理问题的系统。它以事务方式工作,为每个写入操作分配唯一的...
2. 列族存储:与传统关系型数据库不同,HBase采用列族存储,每个表由多个列族组成,列族内可以有任意多的列,这种设计有利于按需读取和压缩存储。 3. 行键和时间戳:HBase的行是通过唯一的行键标识的,数据按照行键...
2. 在Hadoop 1.2的环境下部署HBase时,应避免使用HBase 0.95.0版本,因为这可能导致与Hive 0.11.0的不兼容问题。 3. 对于Hadoop 2.2版本,推荐使用HBase 0.96及Hive 0.12或更高版本,但需注意可能出现的小问题。 4...
通常,Hadoop的版本发布会包括对HBase和Hive的兼容性测试报告,但这并不意味着所有早期版本的HBase和Hive都能与新版Hadoop完全兼容。相反,有时候新版本的Hadoop可能需要与特定版本的HBase和Hive一起使用才能正常...
不同版本的Hadoop可能会对HDFS的API或MapReduce的执行模型进行优化,因此,HBase和Hive需要与相应的Hadoop版本保持兼容。例如,Hadoop 2.x引入了YARN资源管理系统,这可能需要HBase和Hive的更新版本来适应。 对于...
HBase 1.2.6版本与Hadoop 2.7.1版本是兼容的,所以你需要确保你的开发环境配置了这些特定版本的jar包。 首先,我们需要了解HBase和Hadoop的关系。HBase是一个分布式、版本化的NoSQL数据库,构建在Hadoop文件系统...
1. **环境准备**:首先确保已安装Java Development Kit(JDK)且版本不低于1.8,因为HBase依赖于Java运行环境。 2. **下载HBase**:从Apache官网下载最新稳定版的HBase二进制包,解压到指定目录。 3. **配置环境变量...
为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase 的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应用场景,最后重点介绍MVCC机制的实现...
9. **HBase的并发控制**:HBase使用了MVCC(多版本并发控制)机制,确保在并发环境下数据的一致性。每个读操作看到的是某个特定时间点的快照,而写操作则会生成新的版本。 10. **HBase的复制功能**:HBase提供了...
### HBase 安装与使用知识点详解 #### 概述 HBase 是一款构建于 Hadoop 之上的分布式、可扩展的大规模数据存储系统。它提供了类似 Google BigTable 的功能特性,非常适合处理海量数据和高并发读写需求的应用场景。...
此外,这个版本还增强了对多版本并发控制的支持,提升了读写操作的并发性能。 接下来是HBase的1.2.6版本。作为1.2.x系列的一个小版本更新,1.2.6主要关注了bug修复和安全增强。它修复了之前版本中的一些关键问题,...
4. 多版本并发控制(MVCC)优化:通过改进MVCC机制,HBase能够更好地支持并发读写,提升整体性能。 在部署HBase 1.3.0时,需要先安装配置好Hadoop、Hive和Zookeeper。确保所有组件之间的版本兼容性,按照官方文档...
- HBase使用MVCC(多版本并发控制)来保证并发操作的一致性。 - HBase的读操作通常是无锁的,写操作则使用WAL(Write-Ahead Log)确保数据一致性。 9. **HBase的数据模型优化**: - 表设计应遵循稀疏存储原则,...
在本场景中,我们讨论的是HBase的0.90.5版本与Hadoop的0.20.2版本的兼容性。 标题提及的“hbase-0.90.5.tar.gz”是一个压缩文件,包含了HBase的0.90.5版本的所有源码、编译后的二进制文件、配置文件以及相关的文档...
在Java中,我们可以利用Thrift2生成的客户端库来与HBase进行交互。以下是使用Java和Thrift2操作HBase的一些关键知识点: 1. **设置环境**:首先确保你已经在系统中安装了HBase、Java和Thrift2。你需要配置HBase的...