- 浏览: 1777353 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
奔跑的小牛:
例子都打不开
如何使用JVisualVM进行性能分析 -
蜗牛coder:
好东西[color=blue][/color]
Lucene学习:全文检索的基本原理 -
lovesunweina:
不在haoop中是在linux系统中,映射IP的时候,不能使用 ...
java.io.IOException: Incomplete HDFS URI, no host -
evening_xxxy:
挺好的, 谢谢分享
如何利用 JConsole观察分析Java程序的运行,进行排错调优 -
di1984HIT:
学习了~~~
ant使用ssh和linux交互 如:上传文件
HBase如何存取多个版本的值?
废话少说,一般情况下使用Put的这个方法保存一个版本:
/** * Add the specified column and value to this Put operation. * @param family family name * @param qualifier column qualifier * @param value column value */ public Put add(byte [] family, byte [] qualifier, byte [] value) { return add(family, qualifier, this.timestamp, value); } 然后获取HTable的实例,调用Put方法,更新入库。
这里我要刻意说明一下时间戳 ,可以看到上面的add方面实现里面调用了另外一个方法,增加了个参数:默认时间戳
this.timestamp
它的值是:
private long timestamp = HConstants.LATEST_TIMESTAMP; static final long LATEST_TIMESTAMP = Long.MAX_VALUE;
那么获取的时候,获取一个值 也很简单,使用下面的方法:
创建一个Put的实例 /** * Create a Get operation for the specified row. * <p> * If no further operations are done, this will get the latest version of * all columns in all families of the specified row. * @param row row key */ public Get(byte [] row) { this(row, null); } 然后获取HTable实例调用方法 public Result get(final Get get) throws IOException 返回的Result对象 调用 public byte [] getValue(byte [] family, byte [] qualifier) 就可以获取值。
一般的应用可以像上面这样来解决,服务器正常的话不会碰到什么问题,可是要存取多个版本 的话,有可能你会遇到我遇到的问题。 看下面一段代码是否有问题 ?
(里面有如何插入多个版本 ,如何获取多个版本 的方法,顺带说明一个问题)
/** * Test get value of multi versions * * @author dev-cjj * */ public class GetRowVersionsTest extends TestCase { private final byte[] family = Bytes.toBytes("log"); private final byte[] qualifier = Bytes.toBytes("q1"); private final byte[] qualifier2 = Bytes.toBytes("q2"); private final byte[] rowKey = Bytes.toBytes(10001); private final HTable table = IDMHBaseConfiguration.getTable("testTable"); private final long ts1 = 1298529542218L; private final long ts2 = ts1 + 100; private final long ts3 = ts1 + 1000; private final long ts4 = ts1 + 2000; private final long ts5 = ts1 + 3000; private final byte[] value1 = Bytes.toBytes("value1"); private final byte[] value2 = Bytes.toBytes("value2"); private final byte[] value3 = Bytes.toBytes("value3"); private final byte[] value4 = Bytes.toBytes("value4"); private final byte[] value5 = Bytes.toBytes("value5"); private void insert(final long ts, final byte[] value) throws IOException { // table.setAutoFlush(false); final Put put = new Put(rowKey); put.add(family, qualifier, ts, value); put.add(family, qualifier2, ts, value); table.put(put); } private void sleep() { try { Thread.sleep(1000); } catch (final InterruptedException e) { e.printStackTrace(); } } @Test public void testGetRowMultipleVersions() throws Exception { insert(ts1, value1); sleep(); insert(ts2, value2); sleep(); insert(ts3, value3); sleep(); insert(ts4, value4); sleep(); insert(ts5, value5); sleep(); // check getRow with multiple versions final Get get = new Get(rowKey); get.setMaxVersions(); final Result r = table.get(get); // one way get values of all version // final List<KeyValue> list = r.list(); // for (final KeyValue kv : list) // { // System.err.println(Bytes.toString(kv.getKey())); // System.err.println(kv.getTimestamp()); // System.err.println(Bytes.toString(kv.getValue())); // } // another way get values of all version final NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = r.getMap(); final NavigableMap<byte[], NavigableMap<Long, byte[]>> familyMap = map.get(family); final NavigableMap<Long, byte[]> versionMap = familyMap.get(qualifier); for (final Map.Entry<Long, byte[]> entry : versionMap.entrySet()) { System.err.println(Bytes.toString(qualifier) + " -> " + Bytes.toString(entry.getValue())); } final NavigableMap<Long, byte[]> versionMap2 = familyMap.get(qualifier2); for (final Map.Entry<Long, byte[]> entry : versionMap2.entrySet()) { System.err.println(Bytes.toString(qualifier2) + " -> " + Bytes.toString(entry.getValue())); } // assertTrue(versionMap.size() == 5); // assertTrue(value1 == versionMap.get(ts1)); // assertTrue(value2 == versionMap.get(ts2)); // assertTrue(value3 == versionMap.get(ts3)); // table.delete(new Delete(rowKey)); // assertTrue(table.get(get).size() == 0); // table.close(); } }
这里我只是打印输出结果 ,不用断言, 结果如你所期望的是:
q1 -> value5 q1 -> value4 q1 -> value3 q1 -> value2 q1 -> value1 q2 -> value5 q2 -> value4 q2 -> value3 q2 -> value2 q2 -> value1
上面的代码中,我注视掉了一个关键行
// table.delete(new Delete(rowKey));
如果取消注释,再运行几次你会发现一个大问题! 保存不上了,一个版本都没有。
final Result r = table.get(get); 里面什么都不会有! 很奇怪!
问题原因 (针对上面的代码和问题):
1、插入的时候使用的时间戳都是过去的时间戳。
2、删除的时候没有指定时间戳(如果没有指定则默认一个当前的时间戳)
3、在HBase中删除操作并没有删除对应的文件,只是做一个带有时间戳的删除标记(任何在这个时间戳之前的列值都会被认为是删除的)
那么知道上面三条规则,问题就简单了,新插入的列值的时间戳要在删除标记的时间戳之后,才会被认为是不被删除的列值。
补充一点,创建/添加列族时候默认是三个版本,可以修改为1个版本或者更多个版本,我上面5个版本是因为我指定了5个版本。
{NAME => 'testTable', FAMILIES => [{NAME => 'log', COMPRESSION => 'NON true E', VERSIONS => '5', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEM ORY => 'false', BLOCKCACHE => 'true'}]}
评论
1 楼
hanwei59
2011-10-21
请问如何从多版本中获取最新版本呢?
setMaxVersions只是设置返回的版本数,并不是最新版本。
setTimeRange和setTimeStamp可以指定时间戳,但是我要从多个列中查询数据,每个列的时间戳是不一样的(有的列可能后来修改了数据)
请问有办法同时获取每个列的最新版本数据吗?
setMaxVersions只是设置返回的版本数,并不是最新版本。
setTimeRange和setTimeStamp可以指定时间戳,但是我要从多个列中查询数据,每个列的时间戳是不一样的(有的列可能后来修改了数据)
请问有办法同时获取每个列的最新版本数据吗?
发表评论
-
HBase配置LZO压缩
2011-07-10 22:40 6116系统: gentoo HDFS: hadoop:hado ... -
HBase RegionServer 退出 ( ZooKeeper session expired)
2011-04-23 08:32 9018RegionServer 由于 ZooKeeper sessi ... -
HBase迁移数据方案1(两个集群不能通信)
2011-03-30 18:23 3816前一篇文章里面介绍了 两个可以直接通信的集群之间很容易拷贝数据 ... -
HBase如何迁移数据
2011-03-10 13:42 6463HBase如何迁移数据?这里有个方案:http://blog. ... -
HBase简介(很好的梳理资料)
2011-01-30 10:18 130589一、 简介 history s ... -
Google_三大论文中文版(Bigtable、 GFS、 Google MapReduce)
2010-11-28 16:30 22147做个中文版下载源: http://dl.iteye.c ... -
hadoop主节点(NameNode)备份策略以及恢复方法
2010-11-11 19:35 27729一、dits和fsimage 首先要提到 ... -
HRegionServer: ZooKeeper session expired
2010-11-01 14:21 11409Hbase不稳定,分析日志 ... -
Bad connect ack with firstBadLink
2010-10-25 13:20 8286hbase报的错误,经过分析是Hadoop不能写入数据了。可恶 ... -
hbase0.20.支持多个主节点容灾切换功能(只激活当前某个节点,其他节点备份)
2010-09-09 14:53 2837http://wiki.apache.org/hadoop/H ... -
java.io.IOException: Incomplete HDFS URI, no host
2010-09-07 08:31 16126ERROR org.apache.hadoop.hdfs.se ... -
升级hadoop0.20.2到hadoop-0.21.0
2010-09-05 11:52 7719按照新的文档来 更新配置: http://hadoop.apa ... -
hadoop-hdfs启动又自动退出的问题
2010-05-20 10:45 6060hadoop-hdfs启动又自动退出的问题,折腾了我1天时间啊 ... -
在windows平台下Eclipse调试Hadoop/Nutch
2010-04-29 14:34 3264即让碰到这个问题说明 准备工作都做好了,软件包,环境什么的这里 ... -
Hadoop运行mapreduce实例时,抛出错误 All datanodes xxx.xxx.xxx.xxx:xxx are bad. Aborting…
2010-04-29 14:26 6366Hadoop运行mapreduce实例时,抛出错误 All d ... -
cygwin 添加用户
2010-04-13 17:48 7348http://hi.baidu.com/skychen1900 ... -
nutch总体输入输出流程图解析
2010-04-12 16:58 2426附件里面有word文档,请下 ... -
解析hadoop框架下的Map-Reduce job的输出格式的实现
2010-04-10 18:34 10093Hadoop 其实并非一个单纯用于存储的分布式文 ... -
nutch分布式搭建
2010-04-06 17:54 6789如何在eclipse中跑nutch :http://jiaj ... -
解析Nutch插件系统
2010-03-31 16:31 6489nutch系统架构的一个亮点就是插件,借鉴这个架构我们 ...
相关推荐
hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】,避免下载后才发现不兼容的坑
实现了HBase的存取,很有借鉴性。是一个在eclipse运行的完整代码
HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...
多线程 hbase
HBase开启审计日志
phoenix-hbase各个版本源码的下载地址,由于phoenix对hbase的版本有要求,所以大家根据自己环境的情况下载
很多刚入门的同学找不到版本对应关系,这里从官网整理下来,供大家参考 hadoop、hbase、hive版本对应关系.新手指导hadoop、hbase、hive版本对应关系查找表
大数据安全-kerberos技术-hbase安装包,hbase版本:hbase-2.2.6-bin.tar.gz
hadoop、hbase、hive、zookeeper版本对应关系续(最新版)
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
HBase应用架构 [美] 吉恩-马克·斯帕加里(Jean-Marc Spaggiari) 著,陈敏敏 夏锐 陈其生 译
eclipse链接hbase所需jar包,hbase版本1.2.6,Hadoop版本2.7.1
eclipse链接hbase所需jar包,hbase版本1.2.6,Hadoop版本2.7.1(转载的另一篇下载的,亲测可用)
HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...
HBase AMWU-大数据一:hello HBase (HBase1.03伪单机版本安装,Windows7 JAVA远程调用)
HBase 多租户使用
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. HBase shell如何写过滤条件 7. 如何删除HBase中的表 8. 简述HBase的表操作对象 9. HBase中为了提升并行插入数据的速度,如何...
1、HBase高清权威指南中文版本 2、文档包含目录结构 其他不多说
Hbase数据库2.0.0版本介绍 Assignment Manager v1 root of many operational headaches ● Redo based on custom “ProcedureV2”-based State Machine ○ Scale/Performance ○ All Master ops recast as Pv2 ...