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的
分享到:
相关推荐
java操作Hbase之从Hbase中读取数据写入hdfs中源码,附带全部所需jar包,欢迎下载学习。
springboot搭建的hbase可视化界面 支持hbase的建表与删除 支持根据rowkey查询数据
HBASE的一个读取数据流程的解析,清晰的画出整个过程,十分有利于理解
kettle集群搭建以及使用kettle将mysql数据转换为Hbase数据
从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来讲解实战HBase 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为...
python 连接hbase 打印数据。hbase 的一些源数据未转化
为解决现有的HBase数据压缩策略选择方法未考虑数据的冷热性,以及在选择过程中存在片面性和不可靠性的缺陷,提出了基于HBase数据分类的压缩策略选择方法。依据数据文件的访问频度将HBase数据划分为冷热数据,并限定具体...
分布式数据库HBase在大规模数据加载中较传统关系型数据库有较大的优势但也存在很大的优化空间.基于Hadoop分布式平台搭建HBase环境,并优化自定义数据加载算法.首先,分析HBase底层数据存储,实验得出HBase自带数据加载...
hbase备份和数据恢复,hbase与hive的互导,hbase和hdfs互导。
hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】,避免下载后才发现不兼容的坑
Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据)
使用spark读取hbase中的数据,并插入到mysql中
将数据从Hadoop中向HBase载入数据,该过程大致可以分为两步: 一、将Hadoop中普通文本格式的数据转化为可被HBase识别的HFile...二、将HFile载入到HBase中,该过程实际就是将数据从一个地移动到HBase某表数据的存放地。
HBase基本数据操作详解,分享给大家!
根据mysql中数据库配置表信息查询mysql中数据,将部分处理为json格式,上传到hbase中。
2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...
这是hbase对数据存储的代码实现,让你轻松秒懂hbase,
介绍hbase和hadoop数据块损坏如何处理
假设有一个不知道是干什么表:) 表里需要存入人员和其相对应的部门信息 HBaseAdmin admin = new HBaseAdmin(configuration); List<Put> putuser = new ArrayList();