1. 前言
笔者刚从大数据跳槽到了数据挖掘,有很多过去操作大数据的经验还是想记录下来吧。其中印象比较深刻的还是Hbase的磁盘一直满,然后清理用的TTL设置,需求就是需要自动删除n天前的hbase数据,比起写代码定时删除来说还是用自带的TTL(Time To Live)比较方便一些,为此也是做了很多实验以及发现了MinVersion这个机制。
2.TTL设置
首先熟悉hbase的人都知道hbase的每个字段的值都会有一个时间戳代表这个字段的最后更新时间,而TTL就是根据这个时间戳进行定期删除的。
TTL的设置非常简单,是针对XX表的XX列簇设置的,具体命令为:
disable '表名' (操作前一定要先disable)
alter '表名' , {NAME=>'cf',TTL=>'600000'} (时间单位是秒,n天就是n*24*60*60)
enable '表名' (呜呜,可能会需要特别长的时间,千万别强行关掉,手贱ctrl+c过,然后就没法enable了,原因是zk以为你enable了但是实际上还没有,然后就会有冲突。还是别手贱了,真的这么操作了自己百度看看怎么删掉zk里的记录)
3.MinVersion的影响
是不是以为这样的完了,测试后发现xx时间前的数据真的查不到了?然后又发现磁盘空间并没有释放,这就是问题所在了,如果你再把TTL改的很长很长,就会发现之前以为删掉的数据又可以查到了,说明hbas还保留着这条数据,这就是MinVersion的影响了。
MinVersion:如果当前存储的所有时间版本都早于TTL,至少MIN_VERSION个最新版本会保留下来。这样确保在你的查询以及数据早于TTL时有结果返回。
所以要起到完全删除数据的作用的还需要设置MIN_VERSION为0,命令如下,这样就不会保留任何版本了。
alter '表名', {NAME => 'cf', MIN_VERSIONS => '0'}
4.真·磁盘清理
好了,该设置的都设置完了发现磁盘空间还是没有释放(WTF),再次查询资料发现因为删除之后的碎文件还没有合并,这时候要用到的机制是major_compact 俗称大合并,hbase默认配置是24小时执行一次这个,手动执行的话可以major_compact '表名',然后就会发现磁盘空间在陆陆续续释放出来了(数据量很大的话可能没那么快清理完)