小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Hbase多版本的讀寫(Shell&Java API版)

 春和秋榮 2019-10-29

 Hbase是基于HDFS的NOsql數(shù)據庫,它很多地方跟數(shù)據庫差不多,也有很多不同的地方。這里就不一一列舉了,不過Hbase有個版本控制的特性,這個特性在很多場景下都會發(fā)揮很大的作用。本篇就介紹下基于ShellJava API的Hbase多版本的讀寫。

為了更好的理解多版本,我們可以把普通的數(shù)據存儲理解成二維空間,提供了rowkey,列族,列幾個存儲的維度。那么版本則相當于二維空間升華到了三維空間,多了時間維度的概念。如果按照默認的操作,當前的時間戳就是版本號,每個數(shù)據都可以保留多個版本的數(shù)據。你可以只查詢最新的數(shù)據,也可以查看歷史版本。

這里課外引申一下:從一維到十維空間,有興趣的可以看一下。 <-- 不要當真哈!從思維開始就已經扯淡了! 上個月在閱讀《三體》的時候,也很感嘆最后都是多維空間拯救了人類!

話題扯遠了,回過來我們在看一下多版本如何進行讀寫

第一步,創(chuàng)建表并開啟多版本

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

創(chuàng)建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,即默認只保留一個版本的數(shù)據,如果不修改,無論你怎么寫,都只能查到一個版本的數(shù)據。

更多參數(shù)信息,可以查看HColumnDescriptor的Java Doc

修改版本數(shù)

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讀取多個版本的數(shù)據

注意:如果讀取的版本大于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的讀寫

首先,需要創(chuàng)建工具類,包含連接的配置

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);//設置讀取的最大的版本數(shù)
        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./hbase/ 2 hbase官方文檔:http://hbase./book.html#appendix_contributing_to_documentation 3 一維到十維空間:http://www.sohu.com/a/116444282_482877

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多