`
shenchunhui
  • 浏览: 147329 次
  • 来自: 杭州
社区版块
存档分类
最新评论

HBase中数据的多版本特性潜在的意外

阅读更多
HBase做为KeyValue结构存储,在存储上是依照RowKey的字典序进行排序,对于很多应用而言这可能远远不够,好在HBase的数据可以存储多个版本,并且版本可以排序,其理论上最大的版本数目Integer.MAX_VALUE,这在一定程度上简化应用端的设计

举个例子,假设现在有一个应用,对用户的每次登录信息(如:时间+IP)进行,并要求可以快速获取指定用户的最近登录信息,如果选用HBase存储则可以设计为:RowKey为用户ID,value为IP地址,并指定timestamp为登录时间,依照版本的保留特性,可以很容易地保存用户近一月、近一年的登录信息。

看起来上面的设计很不错,毕竟用户啥都不需要操作,HBASE可以很容易为你保留近一段时间内的数据

但是,如果一知半解,很可能会发生一些你意料之外的现象

1.先后插入两条数据,他们拥有相同的RowKey,列,以及timestamp,不同的value
实际结果:只能获取到第2次插入的数据,而不是两个版本

2.先插入一条数据,版本为t1,然后删除版本t1,再插入一条数据,版本仍为t1
实际结果:读取版本为t1的数据时为空

3.先删除版本小于t1的数据,再插入一条数据,版本为t2,并且t2<t1
实际结果:读取版本为t2的数据时为空

出现这样现象的原因可由KeyValue的大小计较 和 HBase的插入删除逻辑解释

a.KeyValue的大小比较规则,优先级从大到小依次为RowKey cf+cq timestamp type,
具体点比如说,在比较2个KeyValue时,先比较RowKey的大小('a' < 'b'),相同的情况下比较cf+cq的大小('cf1:q1'<'cf2:q1'<'cf2:q2'),如果还是相同的话就比较时间戳(3042211081<3042211080,注意 我没写错,你没看错,时间戳的long值越大,表示数据越新,在从小到大的队列中越靠前),如果上述仍然还相同则比较TYPE('DeleteFamily' < 'DeleteColumn' < 'Delete' < Put)


b.HBase的插入和删除都是是向HBase提交一条KeyValue,而真正的物理删除发生在compact时,所以,在客户端,虽然相同的版本插入和删除有先后顺序,但是在服务端上,这是不可见的,相同的版本号,delete类型的KV永远都排在put前,而读到delete的kv后,就直接返回了

如果要避免23现象出现,则需要在插入前做compact操作,这样才能得到想要的结果

4.HBase设计为版本数最多为Integer.MAX_VALUE,但是如果你真插入了接近该数的版本后,那可能有很大的风险在等着你
首先,compact时很有可能就out of memory
其次,单个rowkey的region再大也是不会split的
3
2
分享到:
评论
3 楼 kelvinnecessary 2016-01-27  
朝阳之辉 写道
你好,看了你这篇文章,受益匪浅。你文中提到:
“1.先后插入两条数据,他们拥有相同的RowKey,列,以及timestamp,不同的value
实际结果:只能获取到第2次插入的数据,而不是两个版本”

我现在在用bulkload到如历史数据的时候就发生了此种情况,导致我的数据丢失,怎样保证bulkload过程中对于rowkey相同的记录生成的时间戳不重复呢?请多多指教,谢谢!


为什么不能获取两个版本,这个是什么原因,没有看明白,请指教
2 楼 朝阳之辉 2013-07-17  
你好,看了你这篇文章,受益匪浅。你文中提到:
“1.先后插入两条数据,他们拥有相同的RowKey,列,以及timestamp,不同的value
实际结果:只能获取到第2次插入的数据,而不是两个版本”

我现在在用bulkload到如历史数据的时候就发生了此种情况,导致我的数据丢失,怎样保证bulkload过程中对于rowkey相同的记录生成的时间戳不重复呢?请多多指教,谢谢!
1 楼 bin_1715575332 2013-01-24  
那么说插入更新不是要手动compact一下才好?那看来hbase还是比较适合读写,插入删除多的不合适啊

相关推荐

    hbase数据可视化系统

    HBase的数据模型是列族式,数据按行和列进行组织,每个行都有一个唯一的RowKey,列族内则可以有任意多的列。 二、SpringBoot介绍 SpringBoot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程。...

    hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】

    在大数据领域中,Hadoop、HBase和Hive是重要的组件,它们通常需要协同工作以实现数据存储、管理和分析。随着各个软件的版本不断更新,确保不同组件之间的兼容性成为了一个挑战。本文将介绍Hadoop、HBase、Hive以及...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    下面是一段简单的Java代码示例,演示如何从HBase中读取数据: ```java import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client....

    Hbase同步数据到Solr的方案

    当HBase中的数据发生变化(如Put或Delete操作)时,这些变更会被记录在WAL(Write-Ahead Log)日志中。随后,后台的复制线程会将这些变更事件发送到Solr,以创建或更新索引。这一过程与MySQL的主从复制机制类似,每...

    hbase备份和数据恢复

    2. HBase到Hive:通过MapReduce任务,将HBase中的数据导入到Hive,创建Hive表并加载数据。也可以使用HBaseSerDe来解析HBase数据。 三、HBase和HDFS互导 1. HBase到HDFS:可以通过HBase的Export工具,将HBase表的...

    kettle集群搭建以及使用kettle将mysql数据转换为Hbase数据

    4. **数据加载**:将转换后的数据加载到HBase中。需要注意的是,这里需要配置好HBase的相关参数,如HBase表的名称、列族等信息。 5. **运行作业**:设置作业参数,运行作业将数据从MySQL迁移到HBase。 #### 四、...

    hbase和hadoop数据块损坏处理

    HBase 和 Hadoop 数据块损坏处理 HBase 和 Hadoop 数据块损坏是非常常见的问题,可能会导致数据丢失、集群崩溃等严重后果。因此,了解如何处理 HBase 和 Hadoop 数据块损坏是非常重要的。本文将介绍 HBase 和 ...

    hbase的操作数据demo

    删除数据在HBase中分为单个版本的删除和完全删除两种。单个版本删除可以通过`delete`命令指定时间戳,完全删除则使用`deleteAll`,它会删除指定行下所有版本的数据。这些操作在高并发环境下需要注意同步和原子性问题...

    Hadoop数据迁移--从Hadoop向HBase载入数据

    HFile是HBase中的存储格式文件,它可以被HBase识别和读取,类似于传统数据库中的数据文件。在转换过程中,Hadoop MapReduce程序用于处理文本文件中的数据,并生成HBase能识别的HFile格式。这一步骤需要将原始文本...

    浅谈HBASE数据结构设计.pdf

    - 时间戳(Timestamp):HBase中存储数据时可以给单元格附加时间戳,表示不同时间点的数据版本。 3. 数据模型 HBase数据模型采用列式存储,每个列族下可以有无限多的列。在存储时,每个列族的列数据不会混合存储,...

    mysql中数据经处理导入到hbase中

    本文将详细介绍如何将MySQL中的数据处理成JSON格式并导入到HBase中。 首先,我们需要了解MySQL的基本操作。MySQL是一个流行的开源RDBMS,它支持SQL语言,用于创建、查询、更新和删除数据库中的记录。在本场景中,...

    hbase海量数据的全量导入方法

    在大数据领域,HBase作为一款分布式、版本化的宽列存储NoSQL数据库,以其高效的数据读取能力而著称。然而,在面对大规模数据导入时,其compaction机制可能会成为性能瓶颈。本文将深入探讨如何有效地进行HBase的全量...

    HBase官方指南——数据模型篇

    单元格是HBase中存储数据的基本单元,它包含了行键、列簇、列限定符、值以及时间戳(Timestamp)。每个单元格可以存储一个值,并带有时间戳标记,表示该值被写入时的时间。时间戳可以用来解决数据版本的问题。 5. ...

    HBase海量数据存储实战视频教程

    从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来讲解实战HBase 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为...

    hbase读取数据过程

    HBASE的一个读取数据流程的解析,清晰的画出整个过程,十分有利于理解

    hbase2.5.6最新版本下载

    在2.5.6这个版本中,HBase继续提供高性能、高可靠性以及可扩展性的特性,使得它成为大数据存储的理想选择。下面我们将详细探讨HBase的核心概念、功能以及2.5.6版本可能带来的改进。 一、HBase概述 1. 分布式架构:...

    hbase存储csv数据的代码实现

    本文将深入探讨如何使用代码实现将CSV(逗号分隔值)数据存储到HBase中,帮助你更好地理解和掌握HBase的用法。 首先,我们需要理解HBase的基本概念。HBase是构建在Hadoop之上的NoSQL数据库,它以行键、列族、列和...

    python 连接hbase 打印数据

    python 连接hbase 打印数据。hbase 的一些源数据未转化

    HBase应用架构PDF版本

    3. **行与列族**:HBase中的数据以行和列族的形式组织。行键是唯一的,列族下可以有多个列,每个列都有一个时间戳,这使得多版本并发控制成为可能。 4. **Region划分**:为了提高读写性能,HBase将表分成多个Region...

    Hive、MySQL、HBase数据互导

    - 运行Sqoop命令,将MySQL数据导入到HBase中。 **4. 使用HBase Java API把数据从本地导入到HBase中**: - 创建Java项目,导入HBase相关依赖库。 - 使用HBase的Admin API创建HBase表。 - 编写代码,使用Table和...

Global site tag (gtag.js) - Google Analytics