1.声明
当前内容主要用于本人学习和复习,当前的内容主要为查看和操作HBase的Keeping Deleted Cells官方文档
2.Keeping Deleted Cells
By default, delete markers extend back to the beginning of time. Therefore, Get or Scan operations will not see a deleted cell (row or column), even when the Get or Scan operation indicates a time range before the delete marker was placed.
默认情况下,删除标记将会延迟到开始时间。在这之前,使用Get或者Scan操作都将不会看到一个删除的单元格(行或者列),甚至使用Get或者Scan操作并指定一个在删除标记前的时间范围也不会看到一个删除的数据
就是说,删除的单元格数据,在默认情况中调用Get和Scan并制定时间也是无法查看删除的单元格数据
olumnFamilies can optionally keep deleted cells. In this case, deleted cells can still be retrieved, as long as these operations specify a time range that ends before the timestamp of any delete that would affect the cells. This allows for point-in-time queries even in the presence of deletes.
列族可以操作保留删除的单元格。在这种情况下,删除的单元格任然是可以被检索的,只要这个操作的时间范围在这个删除单元格的时间戳之间即可。这允许在删除后的时间点查询事件
Deleted cells are still subject to TTL and there will never be more than “maximum number of versions” deleted cells. A new “raw” scan options returns all deleted rows and the delete markers.
删除的单元格任然受到TTL的影响,并且该删除的单元格它不能超过最大版本号。一个新"raw"scan操作将返回所有删除的行和这个删除标记
通过scan中使用raw可以查看到删除的标记和删除的行
3.添加一个KEEP_DELETE_CELLS的列族
1.使用shell方式添加一个KEEP_DELETED_CELLS的列族
alter 'test',NAME=>'kdc-cf',KEEP_DELETED_CELLS=>true
2.使用java方式添加一个KEEP_DELETED_CELLS列族
/**
* @description 为当前的表添加一个具有KEEP_DELETE_CELLS的列族
* @author hy
* @date 2020-06-17
*/
public class KeepDeleteCellsTest {
public static void main(String[] args) throws IOException, InterruptedException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Admin admin = hBaseUtils.getAdmin();
TableName tableName = TableName.valueOf("test");
// 1.为当前的表添加一个具有KEEP_DELETE_CELLS的列族
ColumnFamilyDescriptor cfDesc = ColumnFamilyDescriptorBuilder.newBuilder("kdc-api-cf".getBytes())
.setKeepDeletedCells(KeepDeletedCells.TRUE)
.build();
admin.addColumnFamily(tableName, cfDesc);
System.out.println("为表添加一个具有KEEP_DELETE_CELLS的列族kdc-api-cf");
hBaseUtils.close();
}
}
这里的KeepDeleteCells是一个枚举类型的数据
结果:
这说明当前的KEEP_DELETE_CELLS默认情况下就是false,只有手动设置才是true
4.开始测试并添加数据
添加一条数据
put 'test','ttl-row','cf:a','aaa'
由于这个cf的KEEP_DELETED_CELLS是false,并且ttl-row这个数据是存在的并没有被删除
现在开始删除这条数据
delete 'test','ttl-row','cf:a'
此时通过shell:scan 'test',{RAW=>true,VERSIONS=>1000}
,返现存在两个数据:一个是实际数据,一个是删除标记
flush数据后
flush 'test'
发现这个值的数据没有了,但是删除标记还存在
major_compact后
major_compact 'test'
发现这个标记也没有了,所以可以认为flush就是将删除的数据的内容清楚,而major_compact 是用来清除删除标记的
5.创建表时使用KEEP_DELETED_CELLS
1.创建表并创建一个具有KEEP_DELETED_CELLS的列族e
create 'kdc-table', {NAME=>'e', VERSIONS=>2147483647, KEEP_DELETED_CELLS => true}
2.为表kdc-table中添加数据
put 'kdc-table','row1','e:cf1','10',10
put 'kdc-table','row1','e:cf1','12',12
put 'kdc-table','row1','e:cf1','14',14
put 'kdc-table','row1','e:cf1','16',16
发现使用scan 'table',{RAW=>true,VERSIONS=>1000}
可以查看以前插入的数据
3.删除指定版本的数据(例如删除版本14的数据)
delete 'kdc-table','row1','e:cf1',14
4.再次查看数据
5.执行flush
flush 'kdc-table'
6.执行major_compact
major_compact 'kdc-table'
到此发现了当前的列族如果开启了保持删除单元格那么,任何删除操作都会保留下来,只是多了一个删除的标记而已
6.最后的测试
KEEP_DELETED_CELLS is to avoid removing Cells from HBase when the only reason to remove them is the delete marker. So with KEEP_DELETED_CELLS enabled deleted cells would get removed if either you write more versions than the configured max, or you have a TTL and Cells are in excess of the configured timeout, etc.
KEEP_DELETED_CELLS 可以避免单元格从HBase中删除,只是删除标记。如果你写入的版本号大于配置的版本号或者你有TTL和单元格超出配置时间那么就算是在删除的单元格中启用了KEEP_DELETED_CELLS 也同样会被删除
1.为表test添加一个具有ttl为10并且具有KEEP_DELETED_CELLS为true的列族
alter 'test',NAME=>'kdc-ttl-cf',TTL=>10,KEEP_DELETED_CELLS=>true
2.添加一些数据
put 'test','row1','kdc-ttl-cf:a','aaaa',10
put 'test','row1','kdc-ttl-cf:b','bbbb',12
put 'test','row1','kdc-ttl-cf:c','cccc',14
put 'test','row1','kdc-ttl-cf:d','dddd',16
3.删除一个数据并指定版本
delete 'test','row1','kdc-ttl-cf:b',12
4.最后查看数据
scan 'test',{RAW=>true,VERSIONS=>1000}
5.flush一次数据
结果数据没有了,刚好对应描述结果
7.总结
1.如果某个表中的列族中删除了数据,那么可以通过scan 'table',{RAW=>true,VERSIONS=1000}
方式查看删除的数据
2.可以通过flush方式删除数据
,通过major_compact删除标记
3.如果一个列族使用了KEEP_DELETED_CELLS=true
,那么始终可以通过scan 'table',{RAW=>true,VERSIONS=1000}
方式查看删除的数据
4.无论当前的列族是否添加KEEP_DELETED_CELLS=true
,只要数据超过了最大版本,或者单元格超时那么,这个数据一定会被删除掉
以上纯属个人见解,如有问题请联系本人!