HBase删除数据

HBase不会定位到需要删除或更新的记录进行操作。由于HBase底层依赖HDFS,对于HBase删除操作来说,HBase无法在查询到之前的数据并进行修改,只能顺序读写,追加记录。为了更新或删除数据,HBase会插入一条一模一样的新的数据,但是key type会标记成Delete状态,以标记该记录被删除了。在读取的时候如果取到了是Delete,而且时间是最新的,那么这条记录肯定是被删掉了。

HFile的存储格式如图所示,每一个单元格或者KeyValue在HFile中的格式如下:
row length + row key + family length + column family + column qualifier + timestamp + key type

同样,进行更新操作的时候,也会重新插入一条新的数据来代替在原来数据上修改。新的数据的timestamp会大于老的数据,这样读取的时候,判断时间戳就可以取出最新的数据了。

HBase修改数据的流程:
1、时间戳
  HBase 中通过 Row 和 Columns 确定的一个存储单元称为 Cell。每个 Cell 都保存着同一份数据的多个版本。 版本通过时间戳来索引,时间戳的类型是 64 位整型。时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

2、修改数据
  当对数据进行修改,修改的数据会将当前的数据覆盖,由hbase在写入数据时自动赋予修改数据后的时间戳,每个 Cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。保证每次获取的数据时最新修改后的数据。

  由于HBase这样的删除和更新机制,如果后面没有一个对于过期数据处理的机制,会导致过期数据越来越大,因此后面的compact操作中的major compact就顺便将过期的数据删除掉了。对于标记为删除的数据,直接删除。对于不同时间戳的多条数据,根据其保存的最大版本数据,删除过期的数据。

HBase每个字段数据会存在多个版本,什么时候会真正删除掉旧版本数据?

flush,从MemStore刷到HDFS的时候,只会把内存中同一cell最新版本的数据刷到HDFS中
compact(major),进行major合并,把所有Hfile文件都合并为一个,多个Hfile文件中相同cell只会把最新的一个版本的数据放到新的Hfile中
Delete类的接口有两个方法:deleteColumns和deleteColumn,它们的区别:

deleteColumns:Delete all versions of the specified column with a timestamp less than or equal to the specified timestamp.
deleteColumn:Delete the latest version of the specified column.

实现上,deleteColumns只是传给server一个时间标签,表示这行数据的最后删除版本,因此仅相当于一个普通的put。deleteColumn必须定位到这行version,因此需要先get到这行数据,再做处理。

  如果对某行数据的一个version进行了删除,在compact之前即使再将同一个version的数据写进去,也是读不到的。原因是HBase定位数据是依靠rowkey/timestamp/family/qulifier。假如这四者都一样,那么多次put/delete是无法知道先后顺序的。因此取哪个值取决于KeyValue.Type的值,Delete是在Put之前。所以扫描到Delete就不会再去读Put了。要想恢复对这个timestamp标签的读写,必须做一次compact,最好是major compact,确保这一行数据己经从物理上删除了,此时就可以再读取值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东境物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值