我们知道hbase是一个多版本的管理系统,在0.96的版本之前默认每个列是3个version,在hbase 0.96之后每个列是1个version,所谓的version其实就是同一条数据插入不同的时间戳来实现的,在hbase底层的存储是基于时间戳排序的,所以每次我们查到的数据都是最新的版本,除非我们指定了要读取特定的时间范围的数据。
先看下Hbase里面Put和Delete命令的api:
Put:
````
Put(byte[] row)
Put(byte[] row, long ts)
Put(byte[] rowArray, int rowOffset, int rowLength)
Put(byte[] rowArray, int rowOffset, int rowLength, long ts)
Put(ByteBuffer row)
Put(ByteBuffer row, long ts)
Put(Put putToCopy)
````
Delete:
````
Delete(byte[] row)
Delete(byte[] row, long timestamp)
Delete(byte[] rowArray, int rowOffset, int rowLength)
Delete(byte[] rowArray, int rowOffset, int rowLength, long ts)
Delete(Delete d)
````
如上,常用的pu和delete方法基本都是第一个,默认我们使用Put命令插入一条数据后,它的时间戳取的是当前时间戳,当然我们也可以自己设置时间戳,但是我建议不要随便设置这个时间戳,设置的不对有可能引起一些莫名奇妙的问题,刚才说过hbase在读取的时候是按时间降序排序的,每次读取到的都是最新的,那么假如在put的时候设置这个时间戳为Long.MAX_VALUE,那么后面你在插入,删除或者更新的时候没有传入时间戳,那么你就会惊奇的发现插入,删除,更新全部失效,为什么? 因为你该次操作的时间戳小于Long.MAX_VALUE,而且你的version只有一个,所以hbase认为一个旧的版本是不能覆盖新的版本的,同样删除也是,你会发现无论你执行多少次删除命令,该条数据就是不能够被删除掉。
注意,在上面的api中Put和Delete的第二个方法都是带时间戳的,大家不要误解,这个时间戳不是rowkey的,它这个时间戳是给下面的column用的,也就是说如果插入一行数据,这行数据中有多个列簇,每个列簇下面都有多个列的话,而且他们的时间戳都一样,那么我就可以直接在put的第二个参数指定,而不需要在每个column上指定,当然如果我们在column上也指定了时间戳,那么默认优先使用column上的时间戳。
总结:
hbase的多版本存储特性是一个强大的功能,在使用的时候应该注意尽量不要修改默认取当前时间戳的逻辑,如果修改了那么在其他添加,删除,更新的时候都应该考虑当前的时间戳是否大于第一次插入时的时间戳,如果不是,那么本次修改就不会生效,所以某一天当你删除一行hbase数据时,发现它并没有被删除掉,不要惊讶,在代码没有问题的情况下,最大的可能就是当前时间戳小于库里数据的时间戳,这一点需要特别注意,最后再重复一遍,尽量不要在向hbase插入数据的时候设置自定义的时间戳,除非业务场景需要。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
HBase相关知识;...既然HBase是数据库,那么数据库从根本上来说就是存储表Table的,但是必须注意HBase并非是传统的关系型数据库(例如:MySQL、Oracle),而是非关系型数据库,因为HBase是一个面向列的分布
deploy.sh build single 构建并启动一个hbase单实例 deploy.sh start single 启动hbase实例 deploy.sh stop single 停止hbase实例 deploy.sh check single 检测hbase实例状态 deploy.sh connect single 连接...
注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下 3.1修改hbase-env.sh export JAVA_HOME=/usr/local/jdk1.6.0_45 //告诉hbase使用外部的zk export HBASE_MANAGES_ZK=false vim hbase-...
Hbase本身只有一级索引rowkey,现在通过Hbase coprocessor协处理器把Hbase的数据索引存储到Elasticsearch,从而建立二级索引;ppt中讲述了一些注意事项,挺有用的,希望能有所帮忙!
在HBase中,表被分割成区域,并由区域服务器提供服务。区域被列族垂直分为“Stores”。Stores被保存在HDFS文件。下面显示的是HBase的结构。 注意:术语“store”是用于区域来解释存储结构。
HBase的Schema设计文档,注意文档为英文书写。从HBase的存储原理开始,讲到HBase表单基本的设计准则。通过例子讲述,比较容易理解。
Hive HBase生成HFile 该项目包含一个示例,该示例利用Hive HBaseStorageHandler生成HFile。 这种模式提供了一种方法,用于获取已存储在Hive中的数据,将其导出为HFile,并从这些HFile批量加载HBase表。概述HFile生成...
mongoDB是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它介于关系数据库和非关系数据库之间,被认为是非关系数据库当中功能最丰富,最像关系数据库的...
生成的数据主要是模拟某学习网站学习视频课程的访问量(其中*以“ / class”开头的表示实战课程,然后通过流水线Flume + Kafka + SparkStreaming进行实时日志的收集,HBase来存储数据)*注意事项(使用的软件工具及...
在Hbase实现中,会在ZK上存储一些ROOT表的地址和HMaster的地址,HRegionServer也会把自己以临时节点(Ephemeral)的方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的存活状态,同时,一旦...
课程目录: 课时1:Spark介绍 课时2:Spark2集群安装 课时3:Spark RDD操作 课时4:SparkRDD原理剖析 ...课时20:操作RDD需要注意点,以及Spark内存分配资源调优 课时21:Spark整个学习过程及其总结
Kundera 和 Kundera-hbase 扩展的 HBase ##Preliminary Operations Kundera 扩展的代码可在 GitHub 上找到:您需要下载它们并通过 maven install 在本地安装 azure table 和 google datastore 的一个,因为在任何...
如果您有想法或其他有趣的资源,请随时打开一个问题或拉取请求。 目录 技术 所有技术都在其给定部分按字母顺序列出。 概览 文件格式 阿夫罗 兽人档案 实木复合地板 协议缓冲区 节约 文件系统 Hadoop 分布式文件系统 ...
在大数据系统中,数据一般采取分布 式存储方式,数据会动态分散在很多个不同的存储设备, 甚至可能是不同的物理地点存储,这样导致难以准确划定 传统意义上的每个数据集的"边界",传统的基于网关模 式的防护手段就...
#Wasp:Megastore和类似F1的系统# 简介: 文件: 当前版本: 随着NoSQL的发展,HBase逐渐成为NoSQL系统产品的主流。... 该系统提供了简单的用户界面:SQL,用户无需注意hbase架构设计,极大地简化
12-13 -功能一之Hbase及打包注意事项 功能1:今天到现在为止实战课程的访问量 yyyyMMdd courseio 使用数据库来进行存储我们的统计结果 Spark Streaming把统计结果写入到数据库里面 可视化前端根据:yyyyMMdd ...
注意:该项目不再由Pinterest积极维护。 Pinterest MySQL管理工具 注意:这些工具将无法正常工作!!! 您需要添加大量胶水才能使这些工具起作用: 服务发现 CMDB 环境规范库中的一堆公司特定信息 希望该代码对您...
hbase)作为服务器端存储 将 IndexedDB 和 Angular Dart 用于客户端存储、客户端框架 使用 golang 和 dartlang 默认支持的 TDD 将 BDD 与 selenium 和 Spinach 一起使用(尚未启动 github....
基于以下是按星数排序的200个顶级机器学习Github存储库的列表。 用于GitHub搜索API的查询是“机器学习”。 日期:03/16/2018 注意:此列表将定期更新。 ID 名称 描述 语 星星 前叉 1个 使用数据流图进行计算以实现可...
连接池(MySQL,Redis,实验AMQP-0-9-1,实验HBase) 存储(文件,秦牛,阿里奥斯) 完整协程 日志(基于Monolog) 分布式锁(基于Redis) 参数验证器 监视器 AMQP-0-9-1 Zipkin跟踪 动态故障注入 热装(包括...