HBase中的delete操作

参照 http://hadoop-hbase.blogspot.com/2011/12/deletion-in-hbase.html

在HBase当中,当客户发出Delete命令时,实际上数据并没有真正被删除,而是被打上了删除标记,使得这个被删除的数据对外不可见(从逻辑上和MySQL的MVCC也很像,就是通过时间戳来判断数据对读者的可见性,代码见MultiVersionConsistencyControl .java)。用户的Scan和Get操作中,会自动把这些打上删除标记的数据filter掉,这些数据会在compaction操作中被真正删除。

HBase的删除标记有三种:

  1. version delete marker 删除指定version的某个qualifier对应的value
  2. column delete marker 删除某个qualifier的所有version的数据
  3. family delete marker 删除column family下所有qualifier对应的所有version的数据 还可以再column和family delete marker上打上时间戳,这时,只有小于这个时间戳的version才会被影响到。

HBase允许进行基于时间的查询从而得到指定时间段的历史数据。查询时间T的数据即查询[0,T+1)的数据。这样就带来了一个潜在的问题。当一个delete marker被set上,所有被它影响到的数据都不再可见。如果你在时间T put了一个qualifier为C的数据,接着在T+X的时间点删除这个qualifier,此时查询[0,T+1)时间段的数据将不会返回qualifier为C的这个KV对。 HBASE-4536 https://issues.apache.org/jira/browse/HBASE-4536解决了这个问题,可以通过在shell里建表时加上 KEEP_DELETED_CELLS=>true或在java client上调用时加上HColumnDescriptor.setKeepDeletedCells(true)。这样,被删除的数据在基于时间的历史数据查询中依然可见(当然要保证delete marker的时间戳不在历史查询的时间范围内)。就刚才的例子来说,加上这个支持后,查询[0,T+1)时间段的数据将会返回C,而查询[0,T+X+1)时间段的数据将不会返回C,因为在该时间点,C也已经被删除了。

转载于:https://my.oschina.net/qzhli/blog/918447

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值