hbase是以rowkey,column,timestamp这三个维度来区分的。
即如果两条记录其rowkey,column,timestamp一样的话,那么hbase就会认为其是相同的数据。
row column value time put r1 cf:c1 '5' 10 put r1 cf:c1 '6' 10 put r1 cf:c2 '7' put r1 af:c2 '8' put r2 cf:c1 '9'
如上所示首先插入一条数据其值为5,然后又插入一条数据其值为6.
此时用客户端接口取到的都是value=‘6’的数据,这可以认为是对原数据的一个覆盖。
我们知道hbase的write数据是以append的形式追加的。只有当前compact的时候才会进行无效数据删除。
那么在compact之前hbase的存储文件就存在该记录的两份不同的数据,那么hbase是怎么区别这两份数据,并返回给用户的呢,下面从代码角度来分析
首先我们来看hbase的put过程,这个逻辑比较清除,首先根据table,和row找到相对应的region,然后和该region的regionserver通信。
其写入过程是一个wal过程,即先写日志后写内存,保证数据不会因为regionserver down而丢失。
写日志的过程不赘述了。
主要来看看写memstore的过程:
private long applyFamilyMapToMemstore(Map<byte[], List<KeyValue>> familyMap) { ReadWriteConsistencyControl.WriteEntry w = null; long size = 0; try { w = rwcc.beginMemstoreInsert(); for (Map.Entry<byte[], List<KeyValue>> e : familyMap.entrySet()) { byte[] family = e.getKey(); List<KeyValue> edits = e.getValue(); Store store = getStore(family); for (KeyValue kv: edits) { kv.setMemstoreTS(w.getWriteNumber()); size += store.add(kv); } } } finally { rwcc.completeMemstoreInsert(w); } return size; }
rwcc是用来控制读写一致性的,对于任何一个put,当其写入memstore的时候,都会设置其MemstoreTs的值。
而这个值在内存中是以一个递增的形式存在的,即新写入内存的数据比旧的其MemstoreTs大。而这个值就是用来保证在内存中的update的可靠性。举个例子,还是上面的两个put
1. put r1 cf:c1 '5' 10
2. put r1 cf:c1 '6' 10
第一条记录首先写进内存其memstoreTs为1,第二条记录的memstoreTs为二,那么第二条记录在内存中就排在第一条记录前面,说到这来看看内存中数据是怎么排序的。
我们知道hbase 是以key-value存放数据的,其底层存储完全依赖HDFS文件系统。
同样在内存中存储的也是key-value,在磁盘上是以storefile(hfile)存储,且都是有序的
其排序规则如下:
(以自然序列排序 a<b,2<3,23<3)
首先比较 rowkey 小的排前面
然后是 family小的排前面
接下来按排 column
然后是timestamp 排序 时间越大的拍前面
接下来是按key的TYPE排序 有min,delete,deleteFamily,put,deletecolumn,max
最后比较文件的maxsequenceId,越大的说明越新排在前面。memstore的maxsequenceId默认是整数最大值
如果是两个相同key的put的数据都在内存里那么上面的比较规则就都不适用了,此时就会比较这两个put的memstoreTs, 大的排在前面。
我们知道一个put里面可以有很多cf,那么如果在一个put当中有两个一样的数据,此时会如何呢。
这个hbase也做了处理。一个put中维护的是一个familymap<family,map<>>格式,显然当有两条一致的数据插入时,map自动会覆盖前一条数据。
那么此时用户以指定key取该条数据的话,会遵循以下原则:
首先从定位memstore和每个storefile(一个family就是一个Hstore,包裹一个Memstore和n个storefile)的target value的row的起始处。,比较当前memstoe和storefile的keyvalue,选取最靠前的数据,若满足则返回,若不满足则取下一条知道找到为止。
显然在这个过程中上述的put的第二条数据肯定是在第一条数据前面的,所以首先会取到第二条即最新的数据~~~
hbase就是通过keyvalue的排序和get的机制来保证取到的都是最新的value
相关推荐
【Hive、MySQL、HBase数据互导】是大数据领域常见的数据处理操作,涉及三个不同的数据存储系统。Hive是一个基于Hadoop的数据仓库工具,它允许使用类SQL的查询语言HiveQL对大规模数据进行批处理和分析。MySQL是一种...
在Java编程环境中,HBase是一种分布式、高性能的NoSQL数据库,常用于大数据处理。本示例代码主要展示了如何使用Java API连接HBase数据库,并执行基本的CRUD(创建、读取、更新、删除)操作,同时也包括了批量操作的...
HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...
在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...
标题“C#使用Thrift2操作HBase数据库”表明我们将讨论如何在C#环境下利用Thrift2库与HBase进行交互,执行基本的数据操作,如添加(Insert)、删除(Delete)、更新(Update)和查询(Select)。 首先,我们需要理解...
- **Update操作**:通过Put操作实现,HBase是无事务的,所以更新就是覆盖旧值。 4. **HBase的优化** - **预分区(Pre-splitting)**:在创建表时预先划分Region,避免单个Region过大导致的性能问题。 - ** Bloom...
4. HBase的操作:包括数据的CRUD操作,即创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。HBase提供了丰富的API来执行这些操作。 5. HBase的高级特性:例如HBase的过滤器、协处理器...
3. **更新(Update)**: 更新数据使用`Put`对象。如果我们要更新`Users`表中`12345`用户的信息,可以这样操作: ```java Put put = new Put(Bytes.toBytes("12345")); put.add(Bytes.toBytes("Info"), Bytes.to...
1. 支持标准的 SQL 语句:Phoenix 支持标准的 SQL 语句,包括 SELECT、INSERT、UPDATE、DELETE 等,用户可以使用熟悉的 SQL 语句来访问 HBase 数据。 2. 高性能:Phoenix 基于 HBase 之上,继承了 HBase 的高性能...
simplehbase是java和hbase之间的轻量级中间件。... insert,update支持: 建立在hbase的checkAndPut之上。 hbase多版本支持:提供接口可以对hbase多版本数据进行查询,映射。 标签:simplehbase
开发者可以预期示例代码会涵盖如何设置HBase REST服务器,建立HTTP请求,执行CRUD操作(Create, Read, Update, Delete)等步骤。 在实际应用中,C#与HBase的交互可能涉及以下关键知识点: 1. **安装和配置HBase**:...
HBase是一种基于Hadoop的分布式NoSQL数据库,能支撑海量数据的存储和处理。下面将详细介绍如何在Eclipse中搭建HBase开发环境,并对HBase进行建表、增、删、改、查等操作。 一、环境准备 首先需要确定HBase和Hadoop...
HBase是建立在Hadoop之上的,使用Google BigTable的数据模型,它是Apache Software Foundation的Hadoop项目的一部分,适用于需要快速随机访问和处理大量数据的场景。 从描述中可以得知,这份文档是由某开发人员在其...
在Ubuntu系统上安装配置HBase是一项重要的任务,尤其对于那些需要处理大规模数据的项目而言。HBase是一个分布式的、面向列的开源数据库,它构建于Hadoop之上,提供了实时读写和强一致性。以下是在Ubuntu上安装和配置...
7. **更新数据(Update)**: 实际上,HBase 更新数据是通过删除旧数据并插入新数据实现的。 8. **关闭表(Disable/Enable)**: `disable '表名'` 或 `enable '表名'` 开启或关闭表。 9. **删除表(Drop)**: `drop '...
为了构建高效、可靠的HBase数据中心,实践中的关键步骤包括: 1. **高性能**:通过优化写入流程,如减小regionserver内存、调整WAL参数为SYNC_WAL以降低I/O压力,以及批量写入优化等手段,提升写入速度。同时,通过...
在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式列式存储系统,而Phoenix则是一个基于HBase的SQL查询引擎。这篇文档将详细介绍如何使用Phoenix通过JDBC(Java Database Connectivity)连接到HBase...
在大数据领域,Apache HBase作为一个分布式、面向列的NoSQL数据库,常用于处理大规模数据。然而,与传统的关系型数据库不同,HBase的操作模式相对复杂,需要通过Java API进行低级别操作。为了解决这一问题,开发者们...
方法包括避免单点保障、确保数据准确、数据对账、update 的特殊处理和系统平台建设等。 结论 HBase 在互联网金融大数据实践中扮演着重要的角色,解决了传统关系数据库的扩展性、可维护性和易用性问题。为了实现高...