4.HBase数据删除的真正时间

put更新操作测试

-- 创建HBase表student
create 'student','info'

-- put数据
put 'student','001','info:name','zhangsan'

-- 全表扫描student
hbase(main):023:0> scan 'student'
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576226988856, value=zhangsan
1 row(s)
Took 0.0550 seconds

flush 'student'


flush后产生文件.png
-- 更新该rowkey的数据
put 'student','001','info:name','lisi'

-- 查看所有版本数据的时候,zhangsan并没有被删掉
hbase(main):009:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576227210750, value=lisi
 001                                            column=info:name, timestamp=1576226988856, value=zhangsan
1 row(s)
Took 0.0164 seconds 

-- 此时进行flush,刷写到磁盘形成小文件。zhangsan依然存在
hbase(main):001:0> flush 'student'
hbase(main):003:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576227210750, value=lisi
 001                                            column=info:name, timestamp=1576226988856, value=zhangsan
1 row(s)
Took 0.0417 seconds 

-- 得到结论: flush后,之前版本的数据不删除,因为flush只管将mem store的数据写成一个文件

之后put、flush使文件达到4个,满足compact大于3的条件,进行merge文件合并


flush文件数达到4.png
hbase(main):014:0> compact 'student'
Took 0.0305 seconds
hbase(main):015:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576227681356, value=lisi3
1 row(s)
-- 此时合并后文件剩余1个,版本数据查询结果也为1。
-- 结论:当进行compact时HFile文件数大于3,触发合成文件操作。会删除之前版本的数据。

delete操作测试

-- 删除该rowkey数据,此时已经打上了Delete标记
hbase(main):003:0> delete 'student','001','info:name'

hbase(main):005:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576227681356, type=Delete
 001                                            column=info:name, timestamp=1576227681356, value=lisi3
1 row(s)
Took 0.0129 seconds

-- 再次刷写文件数到4个
hbase(main):001:0> put 'student','001','info:name','lisi4'
hbase(main):002:0> flush 'student'
hbase(main):003:0> put 'student','001','info:name','lisi5'
hbase(main):004:0> flush 'student'
hbase(main):005:0> put 'student','001','info:name','lisi6'
hbase(main):006:0> flush 'student'
添加数据.png
-- 此时全表扫描还是能找到所有数据
hbase(main):001:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576228552290, value=lisi6
 001                                            column=info:name, timestamp=1576228547984, value=lisi5
 001                                            column=info:name, timestamp=1576228540184, value=lisi4
 001                                            column=info:name, timestamp=1576227681356, type=Delete
 001                                            column=info:name, timestamp=1576227681356, value=lisi3
1 row(s)
Took 0.3525 seconds

-- 进行compact,此时产生了新的合并文件
hbase(main):001:0> compact 'student'
compact后的文件.png
-- 再次查询所有版本数据,只剩下一条最后时间段的数据了
hbase(main):002:0> scan 'student',{RAW=>TRUE,VERSIONS=>10}
ROW                                             COLUMN+CELL
 001                                            column=info:name, timestamp=1576228552290, value=lisi6
1 row(s)
Took 0.0321 seconds
compact一段时间后
结论: (compact 仅指 HFile的文件数大于3时)
1. HBase若在内存中更新数据(put),flush时只刷写最后一条到磁盘。(内存中的数据直接删除了)
2. HBase若将数据flush到不同的文件时,数据并没有删除。
3. 只有compact的时候,才会真正删除数据,只保留指定version条数的数据。
4.delete操作之后,flush的时候会将该数据的状态标记为type=Delete,写到磁盘。
5.只有在compact时,才会将数据删除或者保留指定version条数的数据。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。