博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hbase多版本的读写(Shell&Java API版)
阅读量:7234 次
发布时间:2019-06-29

本文共 5780 字,大约阅读时间需要 19 分钟。

Hbase是基于HDFS的NOsql数据库,它很多地方跟数据库差不多,也有很多不同的地方。这里就不一一列举了,不过Hbase有个版本控制的特性,这个特性在很多场景下都会发挥很大的作用。本篇就介绍下基于ShellJava API的Hbase多版本的读写。

为了更好的理解多版本,我们可以把普通的数据存储理解成二维空间,提供了rowkey,列族,列几个存储的维度。那么版本则相当于二维空间升华到了三维空间,多了时间维度的概念。如果按照默认的操作,当前的时间戳就是版本号,每个数据都可以保留多个版本的数据。你可以只查询最新的数据,也可以查看历史版本。

这里课外引申一下:。 <-- 不要当真哈!从思维开始就已经扯淡了!

上个月在阅读《三体》的时候,也很感叹最后都是多维空间拯救了人类!

话题扯远了,回过来我们在看一下多版本如何进行读写

第一步,创建表并开启多版本

hbase(main):002:0> create_namespace 'xingoo'0 row(s) in 0.0230 secondshbase(main):003:0> create 'xingoo:test_v','v'0 row(s) in 4.5760 seconds=> Hbase::Table - xingoo:test_v

创建Hbase表,并查看表结构:

hbase(main):004:0> describe 'xingoo:test_v'Table xingoo:test_v is ENABLEDxingoo:test_vCOLUMN FAMILIES DESCRIPTION{NAME => 'v', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}1 row(s) in 0.1040 seconds

需要关注的是VERSIONS字段,这个字段默认为1,即默认只保留一个版本的数据,如果不修改,无论你怎么写,都只能查到一个版本的数据。

更多参数信息,可以查看

修改版本数

hbase(main):005:0> alter 'xingoo:test_v',NAME=>'v',VERSIONS=>5Updating all regions with the new schema...1/1 regions updated.Done.0 row(s) in 3.1590 secondshbase(main):006:0> describe 'xingoo:test_v'Table xingoo:test_v is ENABLEDxingoo:test_vCOLUMN FAMILIES DESCRIPTION{NAME => 'v', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}1 row(s) in 0.0150 seconds

再次查看下,就可以看到支持的版本多了。

基于Shell的读写

shell写入多个版本

hbase(main):007:0> put 'xingoo:test_v','1','v:c1','value1'0 row(s) in 0.0870 secondshbase(main):008:0> put 'xingoo:test_v','1','v:c1','value2'0 row(s) in 0.0050 secondshbase(main):009:0> put 'xingoo:test_v','1','v:c1','value3'0 row(s) in 0.0040 secondshbase(main):010:0> put 'xingoo:test_v','1','v:c1','value4'0 row(s) in 0.0040 secondshbase(main):011:0> put 'xingoo:test_v','1','v:c1','value5'0 row(s) in 0.0040 secondshbase(main):012:0> put 'xingoo:test_v','1','v:c1','value6'0 row(s) in 0.0030 secondshbase(main):013:0> put 'xingoo:test_v','1','v:c1','value7'0 row(s) in 0.0040 seconds

shell读取多个版本的数据

注意:如果读取的版本大于Hbase存储的版本,那么只会读取最大VESIONS个记录。

hbase(main):015:0> get 'xingoo:test_v','1',{COLUMN => 'v:c1',VERSIONS=>5}COLUMN                              CELL v:c1                               timestamp=1499088390024, value=value7 v:c1                               timestamp=1499088387559, value=value6 v:c1                               timestamp=1499088385347, value=value5 v:c1                               timestamp=1499088383228, value=value4 v:c1                               timestamp=1499088380943, value=value35 row(s) in 0.0070 secondshbase(main):016:0> get 'xingoo:test_v','1',{COLUMN => 'v:c1',VERSIONS=>6}COLUMN                              CELL v:c1                               timestamp=1499088390024, value=value7 v:c1                               timestamp=1499088387559, value=value6 v:c1                               timestamp=1499088385347, value=value5 v:c1                               timestamp=1499088383228, value=value4 v:c1                               timestamp=1499088380943, value=value35 row(s) in 0.0050 secondshbase(main):017:0> get 'xingoo:test_v','1',{COLUMN => 'v:c1',VERSIONS=>2}COLUMN                              CELL v:c1                               timestamp=1499088390024, value=value7 v:c1                               timestamp=1499088387559, value=value62 row(s) in 0.0060 seconds

另外,还可以把版本字段当做一个时间字段来进行范围查询,如:

hbase> get 't1', 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}

基于Java的读写

首先,需要创建工具类,包含连接的配置

public class HbaseClient {    public static final String TABLE = "xingoo:test_v";    private static Configuration conf = null;    private static Connection conn = null;    static {        try {            conf = HBaseConfiguration.create();            conf.set("hbase.zookeeper.property.clientPort", "2181");            conf.set("hbase.zookeeper.quorum", "zk1,zk2,zk3");            conn = ConnectionFactory.createConnection(conf);        } catch (IOException e) {            e.printStackTrace();        }    }...}

读操作

public void write(String phone,String listing_id) throws IOException {        HTable myTable = new HTable(conf, TableName.valueOf(TABLE));        myTable.setAutoFlush(false, false);        myTable.setWriteBufferSize(3 * 1024 * 1024);        Put p = new Put(Bytes.toBytes("row_key_1"));        //可以自己设置时间戳作为版本号,也可以使用默认时间//        p.addColumn(Bytes.toBytes("v"), Bytes.toBytes("c1"), System.currentTimeMillis(), Bytes.toBytes("test1"));        p.addColumn(Bytes.toBytes("v"), Bytes.toBytes("c1"), Bytes.toBytes("test2"));        System.out.println(System.currentTimeMillis());        myTable.put(p);        myTable.flushCommits();        myTable.close();    }

写操作

public List
read(String q) throws IOException { Table table = HbaseClient.conn.getTable(TableName.valueOf(TABLE)); Scan scan = new Scan(); scan.addColumn("v".getBytes(),"c1".getBytes()); scan.setMaxVersions(3);//设置读取的最大的版本数 RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(q.getBytes()));//基于过滤器设置查询条件 scan.setFilter(rowFilter); ResultScanner r = table.getScanner(scan); List
list = new ArrayList<>(); for(Result result : r) { for (KeyValue kv : result.raw()) { list.add(Bytes.toString(kv.getValue())); } } System.out.println(list.size()); table.close(); return list; }

参考

1 hbase教程:

2 hbase官方文档:
3 一维到十维空间:

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
装饰模式
查看>>
数据备份工具rsync
查看>>
从零单排学Redis【铂金一】
查看>>
Cocoapods相关笔记
查看>>
iOS 基于WebView浏览器的高级开发 (一)
查看>>
Java面试题必考50道(含答案)
查看>>
PDF如何转换成EPUB格式
查看>>
图片压缩
查看>>
Android Canvas 硬件加速引起的clipPath失效问题
查看>>
安装go语言环境
查看>>
Nginx 安装详解
查看>>
基于FckEditor的在线文本编辑器实战教
查看>>
centos 安装mysql+php+apache
查看>>
SharePoint 2016文档库只能创建单一文件故障
查看>>
tomcat 403错误和ls: cannot open directory '.': Permission denied
查看>>
linux下 tar解压 gz解压 bz2等各种解压文件使用方法
查看>>
Beta 答辩总结
查看>>
用工作单元(IUnitOfWork)带给我们的是什么?
查看>>
使用apidocJs快速生成在线文档
查看>>
e.Item.ItemType
查看>>