HBase compaction有什么用

43次阅读
没有评论

这篇文章主要为大家展示了“HBase compaction 有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“HBase compaction 有什么用”这篇文章吧。

compaction 是将多个 HFile 合并为一个 HFile 操作,

进行 compaction 有如下几个作用:

减少 HFile 文件的个数,

HFile 减少可能提高读取性能,

清除过期和删除数据。

compaction 有二种类型:minor 和 major

1)Minor 操作只用来做部分文件的合并操作以及包括 minVersion= 0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。

2)Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,会做删除数据,多版本数据清理工作,最终的结果是整理合并出一个文件。
 

HRegionServer 在启动的时候,会启动 compactionChecker 线程,compactionChecker 会检测 region 是否需要 compaction。

主要执行的逻辑如下:

protected void chore() { for (HRegion r : this.instance.onlineRegions.values()) { if (r == null)
 continue;
 for (Store s : r.getStores().values()) {
 try { long multiplier = s.getCompactionCheckMultiplier();
 assert multiplier   0;
 if (iteration % multiplier != 0) continue;
 if (s.needsCompaction()) {
 // Queue a compaction. Will recognize if major is needed.
 this.instance.compactSplitThread.requestSystemCompaction(r, s, getName()
 +   requests compaction 
 } else if (s.isMajorCompaction()) {
 if (majorCompactPriority == DEFAULT_PRIORITY
 || majorCompactPriority   r.getCompactPriority()) { this.instance.compactSplitThread.requestCompaction(r, s, getName()
 +   requests major compaction; use default priority , null);
 } else { this.instance.compactSplitThread.requestCompaction(r, s, getName()
 +   requests major compaction; use configured priority ,
 this.majorCompactPriority, null);
 }
 }
 } catch (IOException e) { LOG.warn( Failed major compaction check on   + r, e);
 }
 }
 }
 iteration = (iteration == Long.MAX_VALUE) ? 0 : (iteration + 1);
 }
 }

如代码,遍历 onlineRegions,获取每个 region 的 Store 进行判断,其中 needsCompaction 逻辑如下:

public boolean needsCompaction(final Collection StoreFile  storeFiles,
 final List StoreFile  filesCompacting) { int numCandidates = storeFiles.size() - filesCompacting.size();
 return numCandidates  = comConf.getMinFilesToCompact();
 }

minFilesToCompact 由 hbase.hstore.compaction.min(老版本是:hbase.hstore.compactionThreshold) 控制,默认值为 3,即 store 下面的 storeFiles 数量 减去 正在 compaction 的数量 = 3 是,需要做 compaction。

needsCompaction 为 true 后,会调用 compactSplitThread.requestSystemCompaction 方法,发送 compaction 请求,具体内容会在 compactSplitThread 线程里分析。

needsCompaction 为 false 后,会判断是否为 isMajorCompaction,具体逻辑如下:
 

/*
 * @param filesToCompact Files to compact. Can be null.
 * @return True if we should run a major compaction.
 */
 public boolean isMajorCompaction(final Collection StoreFile  filesToCompact)
 throws IOException {
 boolean result = false;
 long mcTime = getNextMajorCompactTime(filesToCompact);
 if (filesToCompact == null || filesToCompact.isEmpty() || mcTime == 0) {
 return result;
 }
 // TODO: Use better method for determining stamp of last major (HBASE-2990)
 long lowTimestamp = StoreUtils.getLowestTimestamp(filesToCompact);
 long now = System.currentTimeMillis();
 if (lowTimestamp   0l   lowTimestamp   (now - mcTime)) {
 // Major compaction time has elapsed.
 long cfTtl = this.storeConfigInfo.getStoreFileTtl();
 if (filesToCompact.size() == 1) {
 // Single file
 StoreFile sf = filesToCompact.iterator().next();
 Long minTimestamp = sf.getMinimumTimestamp();
 long oldest = (minTimestamp == null)
 ? Long.MIN_VALUE
 : now - minTimestamp.longValue();
 if (sf.isMajorCompaction()  
 (cfTtl == HConstants.FOREVER || oldest   cfTtl)) { if (LOG.isDebugEnabled()) {
 LOG.debug( Skipping major compaction of   + this +
   because one (major) compacted file only and oldestTime   +
 oldest +  ms is   ttl=  + cfTtl);
 }
 } else if (cfTtl != HConstants.FOREVER   oldest   cfTtl) {
 LOG.debug( Major compaction triggered on store   + this +
  , because keyvalues outdated; time since last major compaction   +
 (now - lowTimestamp) +  ms 
 result = true;
 }
 } else { if (LOG.isDebugEnabled()) {
 LOG.debug( Major compaction triggered on store   + this +
   time since last major compaction   + (now - lowTimestamp) +  ms 
 }
 result = true;
 }
 }
 return result;
 }

以上是“HBase compaction 有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!