Hbase 数据多版本与数据删除

数据多版本

HBASE 中通过rowkey和column确定的为一个存储单元称为cell。每个cell都可以保存同一个数据的多个版本。

下面通过一个例子来说明Hbase的多版本。

  1. 创建一张表

    # 指定info 列簇中数据的最大版本为3,默认为1
    hbase(main):012:0>  create 'stu', {NAME => 'info', VERSIONS => 3}
    0 row(s) in 1.2550 seconds
    
    => Hbase::Table - stu
    
  2. 插入数据

    hbase(main):013:0> put 'stu', '0001', 'info:name', "name1"
    0 row(s) in 0.0720 seconds
    
    hbase(main):014:0> put 'stu', '0001', 'info:name', "name2"
    0 row(s) in 0.0090 seconds
    
    hbase(main):015:0> put 'stu', '0001', 'info:name', "name3"
    0 row(s) in 0.0050 seconds
    
  3. 查看数据

    hbase(main):016:0> scan 'stu'
    ROW                           COLUMN+CELL                                                                       
     0001                         column=info:name, timestamp=1573921647260, value=name3                            
    1 row(s) in 0.0380 seconds
    

    奇怪,为什么只能查看name3这条记录,name1, name2 去哪里了呢?原来scan扫描表时默认只扫描每条记录的最新版本。

    hbase(main):017:0> scan 'stu', {VERSIONS=>3}
    ROW                           COLUMN+CELL                                                                       
     0001                         column=info:name, timestamp=1573921647260, value=name3                            
     0001                         column=info:name, timestamp=1573921644577, value=name2                            
     0001                         column=info:name, timestamp=1573921639958, value=name1                            
    1 row(s) in 0.0210 seconds
    

    当加上版本参数后,就可以查看到所有的数据了。当然get也是一样的使用方法。

     hbase(main):023:0> get 'stu', '0001', {COLUMN=>'info:name', VERSIONS=>3}
    COLUMN                        CELL                                                                              
     info:name                    timestamp=1573921647260, value=name3                                              
     info:name                    timestamp=1573921644577, value=name2                                              
     info:name                    timestamp=1573921639958, value=name1                                              
    3 row(s) in 0.0080 seconds
    

数据删除

Hbase不存储数据,它的所有数据都存储在Hdfs上。Hdfs文件系统不支持对文件的随机读写,那么Hbase对数据的删除操作是怎么实现的呢?
下面通过例子一探究竟。

  1. 还是使用stu表,插入数据。

    # hbase 插入数据时可以指定时间戳
    hbase(main):011:0> put 'stu', '0001', 'info:address', "address1", 1
    0 row(s) in 0.0120 seconds
    
    hbase(main):012:0> put 'stu', '0001', 'info:address', "address1", 2
    0 row(s) in 0.0070 seconds
    
    hbase(main):013:0> put 'stu', '0001', 'info:address', "address1", 3
    0 row(s) in 0.0100 seconds
    
  2. 查看所有的数据

    hbase(main):016:0>  scan 'stu', {VERSIONS=>3}
    ROW                           COLUMN+CELL                                                                       
     0001                         column=info:address, timestamp=3, value=address1                                  
     0001                         column=info:address, timestamp=2, value=address1                                  
     0001                         column=info:address, timestamp=1, value=address1                                  
    1 row(s) in 0.0140 seconds
    
  3. 删除版本2的数据,再次查看所有的数据

    hbase(main):017:0> delete 'stu', '0001', 'info:address', 2
    0 row(s) in 0.0270 seconds
    
    hbase(main):018:0>  scan 'stu', {VERSIONS=>3}
    ROW                           COLUMN+CELL                                                                       
    0001                         column=info:address, timestamp=3, value=address1  
    

    奇怪,此时只能查看到timestamp=3的数据,timestamp=1和timestamp=2的数据都消失了,为什么呢?
    Hbase中删除记录并不是真的删除了数据,而是放置了一个 墓碑标记(tombstone marker),因为Hdfs不支持对文件的随机读写。被打上墓碑标记的记录在HFile合并时才会被真正的删除。

  4. 查看被打上墓碑标记的数据
    只要记录未被真正的删除还是可以被查看的。

    hbase(main):019:0> scan 'stu', {RAW=>true, VERSIONS=>3}
    ROW                           COLUMN+CELL                                                                       
     0001                         column=info:address, timestamp=3, value=address1                                  
     0001                         column=info:address, timestamp=2, type=DeleteColumn                               
     0001                         column=info:address, timestamp=2, value=address1                                  
     0001                         column=info:address, timestamp=1, value=address1                                  
    1 row(s) in 0.0140 seconds
    

    从查询结果也可以看出删除记录时其实是插入了一条时间戳相同的墓碑标记。

你可能感兴趣的:(Hbase从入门到放弃)