HBase 的 Version, TTL, Compaction

Submitted by Lizhe on Fri, 04/28/2017 - 16:31

首先我们存入两条数据

scan 'tablename'

206

然后对其中第一条进行更新

put 'tablename','rowkey1','columnfamily:height','101px'

207

查看一下rowkey1的所有版本

scan 'tablename',{COLUMN=>'columnfamily',VERSIONS=>100}

208

发现明明想得到多个版本,可是还是只有一个最新的103px ( 我最后一次put的值 ) , 为什么呢?

查看一下表的定义

describe 'tablename'

209

发现VERSIONS默认为1 ( 在建表的时候没有指定)

这里可以使用VERSIONS和MIN_VERSIONS来指定建表时候列簇保存的的最大版本数和最小版本数

create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

create 't2',{NAME => 'f1', VERSIONS => 2, MIN_VERSIONS=>1},{NAME => 'f2', VERSIONS => 2, MIN_VERSIONS=>1}

现在我们只能通过alter table修改这一属性了

disable 'tablename'

210

然后再尝试一下添加一个新版本的数据看一看

put 'tablename','rowkey1','columnfamily:height','105px'

211

可以看到上面已经有两个版本的rowkey1了,再添加几个,可以看到只保存了最新的2个

212

不过在文件系统中查询107px(这里已经看不到了), 其实文件中的值还是存在的

217

接下来为了更好的观察Compaction是如何工作的, 我们先给表添加一个列簇,然后把这个列簇的最小版本数设置成0,再给这个列添加一行数据

columnfamily MIN_VERSIONS => 1 VERSIONS => 2
columnfamily_new MIN_VERSIONS => 0 VERSIONS => 3

215

当前的数据状态是

scan 'tablename',{VERSIONS=>100}

216

 

先来试试major_compact 'tablename'

218

数据没有变化

Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

本来期待的是 " 所有数据删除(delete、TTL过期、超过version)都是在major_compact时候执行的 "

不过发现好像我之前grep到的数据都是在WAL里的 囧