这篇文章主要为大家展示了“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 行业资讯频道!