网上很多人说给HBASE中的表设置TTL以删除过期数据,但实际操作后发现硬盘可用大小根本没有变动。
查资料发现,原因如下:
当一个明确的delete发生时,实际上,数据并没有被删除,只是增加了一个删除标记,在查询时,删除标记阻止记录返回。然后在major compaction的时候,实际的数据才会被删除,删除标记也会从StoreFile删除。如果数据由于TTL被删除,没有删除标记被创建,在压缩时,过期的数据会被过滤,不会被写回到压缩后的StoreFile文件中。
所以,完整的操作应该是这样的(使用的CDH):
1、进入hbase shell,查看具体表desc 'tablename'
2、停用表disable 'tablename'
3、更改表的TTL(time to live)值(一个int值,单位是秒)alter 'tablename',{NAME=>'columnName', TTL => '604800'}
,这就表示这个表的数据只保存七天
4、enable 'tablename'
重新启用表
此时,如果查看df -lh
,你会发现数据还没有被删除,因为空间还没有释放,但是在hbase shell之中你已经查询不到这些数据了。
所以最后需要进入到Cloud Manager,点击HBase的“配置”菜单栏
搜索major
如图,默认最大化压缩七天一次,请根据自己服务器的情况缩短这个值,值越小,删除数据越快,但服务器读写压力也会变大,我自己设成了1天一次。
设置完成后重启服务器,硬盘空间成功释放
参考资料: HBase – Region压缩