数据多版本
HBASE 中通过rowkey和column确定的为一个存储单元称为cell。每个cell都可以保存同一个数据的多个版本。
下面通过一个例子来说明Hbase的多版本。
-
创建一张表
# 指定info 列簇中数据的最大版本为3,默认为1 hbase(main):012:0> create 'stu', {NAME => 'info', VERSIONS => 3} 0 row(s) in 1.2550 seconds => Hbase::Table - stu
-
插入数据
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
-
查看数据
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对数据的删除操作是怎么实现的呢?
下面通过例子一探究竟。
-
还是使用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
-
查看所有的数据
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
-
删除版本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合并时才会被真正的删除。 -
查看被打上墓碑标记的数据
只要记录未被真正的删除还是可以被查看的。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
从查询结果也可以看出删除记录时其实是插入了一条时间戳相同的墓碑标记。