HBase中的delete操作
博客专区 > 刀锋 的博客 > 博客详情
HBase中的delete操作
刀锋 发表于7个月前
HBase中的delete操作
  • 发表于 7个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

参照 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也已经被删除了。

共有 人打赏支持
粉丝 2
博文 15
码字总数 280899
×
刀锋
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: