HBase:保持删除单元格

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,只要数据超过了最大版本,或者单元格超时那么,这个数据一定会被删除掉

以上纯属个人见解,如有问题请联系本人!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值