HBase Major Compaction没有清除Delete标志

【现象总结】手动触发major compaction后,用raw scan发现还有Delete标志存在。
 
找了一行有问题的行,然后手动major compact它所在的region,问题能重现。
已确认两点:
  • 在对应的RegionServer的log里能确认Major compaction成功了,最后生成的新HFile也只有一个。
  • Delete标志没有在Memstore中,因为先触发flush再触发major compaction后还是能看到delete标志

 
用hfile工具打印底层的key value发现Delete标志确实还存在:
Remained_Deletes.png

 
图中的两个时间戳,大的是1542103366506(Tue Nov 13 02:02:46 PST 2018);小的是1473992836877(Thu Sep 15 19:27:16 PDT 2016),都是合法时间戳。另外集群的 hbase.hstore.time.to.purge.deletes 配置是0。
 
大家有遇到过这类诡异的现象吗?对了,HBase版本是 1.2.0-cdh5.7.3
已邀请:

Apache9

赞同来自: beyond

我印象里好像有个配置
 
  /** Parameter name for # days to keep MVCC values during a major compaction */
  public static final String KEEP_SEQID_PERIOD = "hbase.hstore.compaction.keep.seqId.period";
  /** At least to keep MVCC values in hfiles for 5 days */
  public static final int MIN_KEEP_SEQID_PERIOD = 5;
 
就这个,会控制MVCC至少保留几天,默认值是5天,所以你现在再跑一次major compaction可能就没了
 
这个主要是解决replication乱序可能导致主备不一致的问题,比如你先put再delete,同步到备集群之后是先delete再put,如果在中间做了一个major compaction,delete没了,之后同步过去那个put就没法被删掉了,于是数据就不一致了

stigahuang

赞同来自: beyond

更新:我把有问题的一个HFile copy出来,建了个格式一样的新表并bulk load进去我的HFile,发现在新表里major compaction会清理掉这些DeleteColumn的标志!而且这个major compaction是在同一台RegionServer上做的,即同一个RegionServer上做的两个major compaction(属于不同的表),只有新表的会清理Delete标志。旧表不管做几次major compaction都不行(今天做了有十几次)。
 
感觉有可能是这个表的读写方式导致major compaction退化成了minor compaction(虽然log里说的是完成了major compaction)

stigahuang

赞同来自: beyond

更新:昨天的各种尝试能说明底层HFile没问题,表和Server的配置也没问题,因此只能怀疑region的内存状态有问题。于是我把这个region move走,之后再做major compaction,就发现Delete标志被成功清空了!

本来想找另一个region再细查的,但发现整个表的其它region都是正常的了……
有没有可能是这个region有过失败的bulk load,然后内部状态不对,导致所做的major compaction实际都只是minor的?

要回复问题请先登录注册


中国HBase技术社区微信公众号:
hbasegroup

欢迎加入HBase生态+Spark社区钉钉大群