Hbase多版本的读写(Shell&Java API版)

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

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

这里课外引申一下:从一维到十维空间,有兴趣的可以看一下。 <-- 不要当真哈!从思维开始就已经扯淡了!
上个月在阅读《三体》的时候,也很感叹最后都是多维空间拯救了人类!

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

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

hbase(main):002:0> create_namespace 'xingoo'
0 row(s) in 0.0230 seconds

hbase(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 ENABLED
xingoo:test_v
COLUMN FAMILIES DESCRIPTION
{NAME => 'v', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TT
L => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.1040 seconds

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

更多参数信息,可以查看HColumnDescriptor的Java Doc

修改版本数

hbase(main):005:0> alter 'xingoo:test_v',NAME=>'v',VERSIONS=>5
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.1590 seconds

hbase(main):006:0> describe 'xingoo:test_v'
Table xingoo:test_v is ENABLED
xingoo:test_v
COLUMN FAMILIES DESCRIPTION
{NAME => 'v', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TT
L => '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 seconds

hbase(main):008:0> put 'xingoo:test_v','1','v:c1','value2'
0 row(s) in 0.0050 seconds

hbase(main):009:0> put 'xingoo:test_v','1','v:c1','value3'
0 row(s) in 0.0040 seconds

hbase(main):010:0> put 'xingoo:test_v','1','v:c1','value4'
0 row(s) in 0.0040 seconds

hbase(main):011:0> put 'xingoo:test_v','1','v:c1','value5'
0 row(s) in 0.0040 seconds

hbase(main):012:0> put 'xingoo:test_v','1','v:c1','value6'
0 row(s) in 0.0030 seconds

hbase(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=value3
5 row(s) in 0.0070 seconds

hbase(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=value3
5 row(s) in 0.0050 seconds

hbase(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=value6
2 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<String> 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<String> 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教程:http://www.yiibai.com/hbase/
2 hbase官方文档:http://hbase.apache.org/book.html#appendix_contributing_to_documentation
3 一维到十维空间:http://www.sohu.com/a/116444282_482877

本文转自博客园xingoo的博客,原文链接:Hbase多版本的读写(Shell&Java API版),如需转载请自行联系原博主。

时间: 2024-09-20 06:45:03

Hbase多版本的读写(Shell&Java API版)的相关文章

Apache Jackrabbit v2.2.5发布 Java API版内容存储规范

Apache Jackrabbit是一个完全遵守Java API版的内容存储规范(JCR)的实现.是由 http://www.aliyun.com/zixun/aggregation/14417.html">Apache Foundation 提供的 JSR-170 的开放源码实现. 更新说明: Bug fixes [JCR-2888] Namespace comparison in Namespace.java doesn't work, if a ...  [JCR-2889] Occ

HBase Java API详解

[本文转自HBase Java API详解] HBase是Hadoop的数据库,能够对大数据提供随机.实时读写访问.他是开源的,分布式的,多版本的,面向列的,存储模型. 在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图: HBase Master是服务器负责管理所有的HRegion服务器,HBase Master并不存储HBase服务器的任何数据,HBase逻辑上的表可能会划分为多个HRegion,然后存储在HRegion Server群中,HBase Master Server中存

c语言-c通过jni调用 HBASE JAVA API

问题描述 c通过jni调用 HBASE JAVA API jvm.dll!6db71017() 未知[下面的框架可能不正确和/或缺失,没有为 jvm.dll 加载符号] jvm.dll!6db71086() 未知jvm.dll!6db710e0() 未知jvm.dll!6dde9d1d() 未知jvm.dll!6deaa65d() 未知jvm.dll!6ddfd291() 未知jvm.dll!6dd07d3d() 未知jvm.dll!6dd11511() 未知022003e4() 未知jvm.d

Google确认下一个Android版本将不会使用Oracle的Java API

在下一个Android版本中Google将会把应用程序接口(APIs)的实现替换为OpenJDK,它是Oracle私有的Java开发工具包(JDK)的开源版本.Google确认了Android N将会仅依赖于OpenJDK,而非Android自身实现的Java APIs.一位Google的发言人说:"最为一个开源平台,Android的构建是基于开源社区的合作.在即将到来的Android的下一个版本Android N,我们计划将所有Android的Java语言开发包用OpenJDK实现,从而为开发

DB2 NoSQL JSON 功能(三) 使用 Java API 编写应用程序

管理 JSON 文档 - 使用事务和不使用事务 概述 简介 DB2 JSON 是一个可用于 DB2 Linux, Unix and Windows 10.5 的 Technology Preview,提供了以下特性: 一个命令行 shell 用于管理和查询 JSON 数据 一个 Java API 用于应用程序开发 一个有线监听器用于接受和响应通过网络发送的请求. 图 1. DB2 JSON 组件 本文将介绍如何使用 Java 接口管理和查询 DB2 JSON 文档存储中的 JSON 文档.还将讨

《Hadoop与大数据挖掘》一2.4.1 HDFS Java API操作

2.4.1 HDFS Java API操作 Hadoop中关于文件操作类基本上是在org.apache.hadoop.fs包中,这些API能够支持的操作有:打开文件,读写文件,删除文件,创建文件.文件夹,判断是文件或文件夹,判断文件或文件夹是否存在等. Hadoop类库中最终面向用户提供的接口类是FileSystem,这个类是个抽象类,只能通过类的get方法得到其实例.get方法有几个重载版本,如图2-28所示. 比较常用的是第一个,即灰色背景的方法. FileSystem针对HDFS相关操作的

一脸懵逼学习HBase的搭建(注意HBase的版本)

1:Hdfs分布式文件系统存的文件,文件存储. 2:Hbase是存储的数据,海量数据存储,作用是缓存的数据,将缓存的数据满后写入到Hdfs中. 3:hbase集群中的角色: (1).一个或者多个主节点,Hmaster: (2).多个从节点,HregionServer:  1:由于HBase依赖hdfs,所以下载的时候注意HBase的版本: 注:我使用的是hadoop2.4版本的,所以HBase选择支持2版本的:hbase-0.96.2-hadoop2-bin.tar.gz 2:上传hbase安装

使用RTC提供的Plain Java API进行客户端开发

通过阅读本文,您将学会如何使用 Plain Java API 编写客户端代码来进行 RTC 上的二次开发,提高管理 Work Item 整个生命周期的效率,更加高效的实现团队合作. Rational Team Concert (RTC) 是构建在 IBM Rational 面向软件交付技术的下一代协作平台 Jazz 上的第一个协作式的开发环境,它包含了集成的源代码控制.工作项(Work Item)管理和构建管理等功能.http://www.aliyun.com/zixun/aggregation

Easy Java Persistence 2.4发布 关系数据库持久化Java API

EJP是一个强大并且易于使用的http://www.aliyun.com/zixun/aggregation/22.html">关系数据库持久化Java API.EJP的主要特性包括: 1.对象/关系(object/relational)自动映射(A-O/RM)   2.自动处理所有关联   3.自动持久化跟踪 EJP不需要映射注释或XML配置,并且不需要继承任何类或实现任何接口.EJP只用到了Plain Old Java Objects (POJOs)对象.到目前为止,EJP是Java开