HBase是一个多版本管理系统。0.96版本前,每列默认保留3个版本;之后默认为1个版本。版本通过插入时的时间戳区分,存储层按时间戳降序排列,因此默认查询始终返回最新数据,除非指定时间范围。
常用的Put和Delete API默认使用当前系统时间戳,也可以手动指定。但非必要不建议自定义时间戳,否则可能引发异常。
例如,若Put时设置时间戳为Long.MAX_VALUE,后续插入、更新或删除时未传入更大时间戳,由于版本数限制(如1个),HBase会认为新操作属于旧版本,无法覆盖已有数据,导致所有变更无效,甚至删除操作也失效。这时无论执行多少次删除,数据都不会被清除。
需注意,Put和Delete的带时间戳构造方法是为列族或列统一设置时间戳,并非RowKey的时间。若列级别也指定了时间戳,则优先使用列级设置。
总之,HBase的多版本机制强大实用。使用时应尽量避免随意修改默认时间戳逻辑。若确需自定义,必须确保后续所有操作的时间戳均大于首次插入值,否则修改不会生效。当发现删除或更新无法生效时,在排除代码问题后,应优先检查操作时间戳是否小于现有数据版本。再次强调,除非业务明确要求,否则不建议在插入时主动设置时间戳。