- 浏览: 37330 次
- 来自: 杭州
最新评论
什么时候split?
当某store所有文件总大小大于某个值时split,注意,并不是判断某个storefile大小大于某个值。
什么时候compact?
检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact。
flush会遍历这个region的所有store,并一个个执行。
compact遍历这个region找到符合条件的store进行compact.
1. 在flush之后会判断是否需要split和compact
这里的split有一个判断条件,先计算这tableRegionsCount(regionserver上的这个table的online的region个数),
然后循环计算此region的所有store是否太大,这是通过getSizeToCheck方法计算出一个size,若当前的store总大小大于这个值,则表示此region需要split.
getSizeToCheck的计算方法首先判断tableRegionsCount是否等于0,若是则返回hbase.hregion.max.filesize ,若不是,则计算Math.min(getDesiredMaxFileSize(),
this.flushSize * (tableRegionsCount * tableRegionsCount)。
2. compact后split
CompactionRequest.run中,compact完成之后,若完成了compact,则继续判断是否需要compact,判断的依据是if (s.getCompactPriority() <= 0) 表示7减去当前storefile的文件数是否<=0,也就是还有许多文件需要compact。
否则则进行split,在CompactSplitThread.requestSplit中,if (shouldSplitRegion() && r.getCompactPriority() >= PRIORITY_USER) ,首先判断系统设置的hbase.regionserver.regionSplitLimit(此参数可以限制整个系统总的region数)总region数是否大于当前在线的region数,若大于就不会split,再判断是否有这个region所有store中7-文件数>=1的store,两者都符合则split.
有一个疑问:难道不需要判断一下文件大小再split吗???
当某store所有文件总大小大于某个值时split,注意,并不是判断某个storefile大小大于某个值。
什么时候compact?
检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact。
flush会遍历这个region的所有store,并一个个执行。
compact遍历这个region找到符合条件的store进行compact.
1. 在flush之后会判断是否需要split和compact
这里的split有一个判断条件,先计算这tableRegionsCount(regionserver上的这个table的online的region个数),
然后循环计算此region的所有store是否太大,这是通过getSizeToCheck方法计算出一个size,若当前的store总大小大于这个值,则表示此region需要split.
getSizeToCheck的计算方法首先判断tableRegionsCount是否等于0,若是则返回hbase.hregion.max.filesize ,若不是,则计算Math.min(getDesiredMaxFileSize(),
this.flushSize * (tableRegionsCount * tableRegionsCount)。
boolean shouldCompact = region.flushcache(); // We just want to check the size boolean shouldSplit = region.checkSplit() != null; if (shouldSplit) { this.server.compactSplitThread.requestSplit(region); } else if (shouldCompact) { server.compactSplitThread.requestCompaction(region, getName()); }
private long flushSize; @Override protected void configureForRegion(HRegion region) { super.configureForRegion(region); this.flushSize = region.getTableDesc() != null? region.getTableDesc().getMemStoreFlushSize(): getConf().getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE, HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE); } @Override protected boolean shouldSplit() { if (region.shouldForceSplit()) return true; boolean foundABigStore = false; // Get count of regions that have the same common table as this.region int tableRegionsCount = getCountOfCommonTableRegions(); // Get size to check long sizeToCheck = getSizeToCheck(tableRegionsCount); for (Store store : region.getStores().values()) { // If any of the stores is unable to split (eg they contain reference files) // then don't split if ((!store.canSplit())) { return false; } // Mark if any store is big enough long size = store.getSize(); if (size > sizeToCheck) { LOG.debug("ShouldSplit because " + store.getColumnFamilyName() + " size=" + size + ", sizeToCheck=" + sizeToCheck + ", regionsWithCommonTable=" + tableRegionsCount); foundABigStore = true; break; } } return foundABigStore; } /** * @return Region max size or <code>count of regions squared * flushsize, which ever is * smaller; guard against there being zero regions on this server. */ long getSizeToCheck(final int tableRegionsCount) { return tableRegionsCount == 0? getDesiredMaxFileSize(): Math.min(getDesiredMaxFileSize(), this.flushSize * (tableRegionsCount * tableRegionsCount)); } /** * @return Count of regions on this server that share the table this.region * belongs to */ private int getCountOfCommonTableRegions() { RegionServerServices rss = this.region.getRegionServerServices(); // Can be null in tests if (rss == null) return 0; byte [] tablename = this.region.getTableDesc().getName(); int tableRegionsCount = 0; try { List<HRegion> hri = rss.getOnlineRegions(tablename); tableRegionsCount = hri == null || hri.isEmpty()? 0: hri.size(); } catch (IOException e) { LOG.debug("Failed getOnlineRegions " + Bytes.toString(tablename), e); } return tableRegionsCount; }
2. compact后split
CompactionRequest.run中,compact完成之后,若完成了compact,则继续判断是否需要compact,判断的依据是if (s.getCompactPriority() <= 0) 表示7减去当前storefile的文件数是否<=0,也就是还有许多文件需要compact。
否则则进行split,在CompactSplitThread.requestSplit中,if (shouldSplitRegion() && r.getCompactPriority() >= PRIORITY_USER) ,首先判断系统设置的hbase.regionserver.regionSplitLimit(此参数可以限制整个系统总的region数)总region数是否大于当前在线的region数,若大于就不会split,再判断是否有这个region所有store中7-文件数>=1的store,两者都符合则split.
有一个疑问:难道不需要判断一下文件大小再split吗???
boolean completed = r.compact(this); long now = EnvironmentEdgeManager.currentTimeMillis(); LOG.info(((completed) ? "completed" : "aborted") + " compaction: " + this + "; duration=" + StringUtils.formatTimeDiff(now, start)); if (completed) { server.getMetrics().addCompaction(now - start, this.totalSize); // degenerate case: blocked regions require recursive enqueues if (s.getCompactPriority() <= 0) { server.compactSplitThread .requestCompaction(r, s, "Recursive enqueue"); } else { // see if the compaction has caused us to exceed max region size server.compactSplitThread.requestSplit(r); } }
public synchronized boolean requestSplit(final HRegion r) { // don't split regions that are blocking if (shouldSplitRegion() && r.getCompactPriority() >= PRIORITY_USER) { byte[] midKey = r.checkSplit(); if (midKey != null) { requestSplit(r, midKey); return true; } } return false; }
private boolean shouldSplitRegion() { return (regionSplitLimit > server.getNumberOfOnlineRegions()); }
this.regionSplitLimit = conf.getInt("hbase.regionserver.regionSplitLimit", Integer.MAX_VALUE);
public int getCompactPriority() { int count = Integer.MAX_VALUE; for(Store store : stores.values()) { count = Math.min(count, store.getCompactPriority()); } return count; }
发表评论
-
HBase中Lease创建、失效、及常见问题
2013-11-07 11:52 6366HBase通过租约来控制每个scanner的操作时间。 1 ... -
HBase HFile和Hlog的cleaner执行流程和配置项
2013-06-09 14:50 5859HFile和Hlog是HBase中两大文件存在格式,HFile ... -
HLog代码分析及与HBase replication延时
2013-02-19 19:51 2765在分享replication时,有同事提出replicatio ... -
HBase BlockCache 代码分析
2013-02-04 22:08 18381. Cache 读写 调用逻辑: hmaster.handl ... -
HBase replication 代码分析
2013-01-28 17:23 2967随着HBase的大规模应用,HBase的容灾显得特别的重要。 ... -
HBase大集群
2013-01-28 14:02 1232为什么HBase没有大集群? 因为如果一个HBase集群很大, ... -
HBase MVCC基本原理
2012-11-28 16:21 3263HBase MVCC(Multi Version Consi ... -
HBase rpc调用
2012-10-10 18:47 2544HBase rpc 0.94中 例如在client put ... -
HBase keyvalue大小导致OOM
2012-09-27 12:11 1468在HBase上传时,会通过配置参数hbase.client.k ... -
HBase什么时候做minor major compact
2012-10-09 18:11 3797我们都知道compact分为两类,一类叫Minor compa ... -
HBase Put及flush
2012-09-21 10:50 17851. Put及flush a. ...
相关推荐
Compact分为minor compact和major compact两种类型。前者主要合并小文件,后者则会整合所有文件,以优化存储并提高查询性能。然而,major compact会因全量读取而消耗大量IO资源,可能短暂影响查询效率。 此外,当...
大Region,则不太适合经常split和compaction,因为做一次compact和split会产生较长时间的停顿,对应用的读写性能冲击非常大。 HBase性能调优是一个非常复杂的过程,需要根据实际应用场景进行调整。通过调整...
其次, Compact与Split机制是HBase内部数据管理的核心。数据更新首先写入WAL日志和内存的MemStore,当MemStore达到阈值时,会触发flush操作,生成StoreFile。当StoreFile数量过多或大小超过阈值,系统会进行Major ...
当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对StoreFile进行分割(split),等分为...
│ Hbase性能优化-flush、compact、split │ Hbase性能优化-配置snappy压缩 │ Hbase中索引的介绍 │ PHoenix的编译及安装部署 │ PHoenix与Hbase表的关联使用 ├─03_笔记 │ [案例:Hbase的设计及企业优化].txt ├...
`flush '表名'`清空表的缓存,`compact '表名'`和`major_compact '表名'`分别是普通合并和大合并,用于优化存储空间。 以上只是HBase Shell常用的一些命令,实际上还有更多高级操作,如过滤器、性能调优等。熟练...
compact命令和major_compact命令分别用于执行局部压缩和全局压缩操作,优化存储空间的利用。 6. 导出表属性到本地文件:使用describeInJson命令可以将当前表的属性导出为本地的JSON格式文件,方便进行进一步的分析...
当MemStore达到一定大小时,数据会被Flush到StoreFile,并在必要时进行Compact和Split操作。HLog作为WAL,保证数据在写入HBase前先写入日志,以防数据丢失。 HFile是HBase的存储格式,有V1、V2和V3三个版本,V2引入...
- **tools**:提供了一些实用工具命令,如`compact`(压缩)、`flush`(刷新缓存)和`split`(分裂region)等。 - **replication**:用于复制和管理HBase的复制流,包括`add_peer`、`remove_peer`等。 了解这些基本...
3. Region的split和集群管理: Region的split是指将一个region分成多个region的过程。集群管理是通过ZooKeeper+hmaster+hregionserver来实现的。 4. 去掉Reduce阶段: 在某些场景下,去掉Reduce阶段可以提高计算...
9. **flush、compact、split机制**:合理设置Memstore的阈值,控制数据刷新、合并和分割的操作,确保HBase的高效运行。 YARN调优涉及到的任务调度、资源分配等,如调整Container的大小、内存分配策略等,目的是最大...