都知道memstore大小到一定程度后会flush到disk上去,这个大小是由hbase.hregion.memstore.flush.size定义的。flush的时候也不是说马上就flush出去,会有个检查,就是下面这个方法了:
code:hbase 0.20.6, MemStoreFlusher.java
/*
* A flushRegion that checks store file count. If too many, puts the flush
* on delay queue to retry later.
* @param fqe
* @return true if the region was successfully flushed, false otherwise. If
* false, there will be accompanying log messages explaining why the log was
* not flushed.
*/
private boolean flushRegion(final FlushQueueEntry fqe) {
HRegion region = fqe.region;
if (!fqe.region.getRegionInfo().isMetaRegion() &&
isTooManyStoreFiles(region)) {
if (fqe.isMaximumWait(this.blockingWaitTime)) {
LOG.info("Waited " + (System.currentTimeMillis() - fqe.createTime) +
"ms on a compaction to clean up 'too many store files'; waited " +
"long enough... proceeding with flush of " +
region.getRegionNameAsString());
} else {
// If this is first time we've been put off, then emit a log message.
if (fqe.getRequeueCount() <= 0) {
// Note: We don't impose blockingStoreFiles constraint on meta regions
LOG.warn("Region " + region.getRegionNameAsString() + " has too many " +
"store files; delaying flush up to " + this.blockingWaitTime + "ms");
}
this.server.compactSplitThread.compactionRequested(region, getName());
// Put back on the queue. Have it come back out of the queue
// after a delay of this.blockingWaitTime / 100 ms.
this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));
// Tell a lie, it's not flushed but it's ok
return true;
}
}
return flushRegion(region, false);
}
这个code逻辑是:
1. 如果是meta region,没话说,立即flush出去吧,因为meta region优先级高啊;
2. 如果是user的region,先看看是不是有太多的StoreFile了,这个storefile就是每次memstore flush造成的,flush一次,就多一个storefile,所以一个HStore里面会有多个storefile(其实就是hfile)。判断多不多的一个阈值是由hbase.hstore.blockingStoreFiles定义的;
Note:要弄清楚的就是,Hbase将table水平划分成Region,region按column family划分成Store,每个store包括内存中的memstore和持久化到disk上的HFile。
还有一个check flush的地方,就是HRegion里面
/*
* Check if resources to support an update.
*
* Here we synchronize on HRegion, a broad scoped lock. Its appropriate
* given we're figuring in here whether this region is able to take on
* writes. This is only method with a synchronize (at time of writing),
* this and the synchronize on 'this' inside in internalFlushCache to send
* the notify.
*/
private void checkResources() {
// If catalog region, do not impose resource constraints or block updates.
if (this.getRegionInfo().isMetaRegion()) return;
boolean blocked = false;
while (this.memstoreSize.get() > this.blockingMemStoreSize) {
requestFlush();
if (!blocked) {
LOG.info("Blocking updates for '" + Thread.currentThread().getName() +
"' on region " + Bytes.toStringBinary(getRegionName()) +
": memstore size " +
StringUtils.humanReadableInt(this.memstoreSize.get()) +
" is >= than blocking " +
StringUtils.humanReadableInt(this.blockingMemStoreSize) + " size");
}
blocked = true;
synchronized(this) {
try {
wait(threadWakeFrequency);
} catch (InterruptedException e) {
// continue;
}
}
}
if (blocked) {
LOG.info("Unblocking updates for region " + this + " '"
+ Thread.currentThread().getName() + "'");
}
}
这里的memstoreSize是一个region中所有memstore的总大小,blockingMemStoreSize计算的公式如下:
blockingMemStoreSize=hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier
就是说,对整个HRegion来说,所有memstore的总大小大于multiplier个memstore阈值的时候,就开始阻止客户端的更新了,这样是为了避免内存中的数据太多吧。
分享到:
相关推荐
【HBASERegion数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...
在HBase中,客户端和服务器之间的通信主要通过IPC(Inter-Process Communication)和RPC(Remote Procedure Call)进行。HBase采用了自定义的RPC服务框架,名为HBaseRPC。这个框架由多个组件构成,包括RPCServer和...
4. **实时查询**:HBase支持实时的读写操作,这得益于其内存中的数据模型和即时的数据flush机制。 5. **索引与查询优化**:虽然HBase不是关系型数据库,但仍然提供了索引功能,例如,可以使用Secondary Index进行...
伴随数据写入,内存中的数据达到由“hbase.hregion.memstore.flush.size”参数控制的阈值(默认64MB)时,会被写入到region文件中。当region文件大小达到由“hbase.hregion.max.filesize”参数决定的上限(默认256MB...
HBase中的行键按照二进制顺序进行排序,这种排序方式是从左到右逐字节比较的,这种方式确保了数据的高效检索和排序。 3. **HBase的数据存储基础** HBase构建在Hadoop的HDFS之上,这意味着HBase利用HDFS来存储其...
在HBase中,默认情况下,在创建表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这个region写数据,直到这个region足够大了才进行切分。为了加快批量写入速度,可以通过预先创建一些空的...
Region 的数量和每台 RegionServer 上的 Region 数是 HBase 运维中需要检查的重要指标。通过检查 Region 的数量,可以了解 HBase 集群的整体情况,从而进行相应的优化和调整。 2. 缓存命中率 缓存命中率是 HBase ...
在大数据存储领域,HBase作为一个分布式列式数据库,被广泛应用于处理海量结构化数据。...这份资料中的“HBase配置项说明及调优建议.xlsx”应该包含了详细的参数解释和实践案例,是学习和优化HBase不可或缺的参考资源。
5. **HBase的Region分裂**: - 当Region大小超过预设阈值时,Region会被分裂成两个新的Region。 - 这个过程由HMaster监控和执行,以保持负载均衡。 6. **HBase与Hadoop的关系**: - HBase运行在HDFS之上,利用...
1. **HBase元数据存储**:HBase的元数据存储在HBase的Meta表中,这些信息包括表名、列族、Region位置等。`hbase.rootdir`配置项定义了HDFS上的目录,用于存储HBase的数据和元数据。 2. **RegionServer配置**:`...
1. **Region分裂**:当某个`Region`中的`StoreFiles`大小超过`hbase.hregion.max.filesize`设置值时,该`Region`会被分裂成两个新的`Region`。分裂过程中,新的`Region`指向旧`Region`的`StoreFiles`的不同部分。 2....
HBase的参数主要分布在`hbase-site.xml`和`hbase-default.xml`两个配置文件中。`hbase-site.xml`用于覆盖默认配置,而`hbase-default.xml`则包含了所有可能的配置项及其默认值。 三、关键参数详解 1. `hbase....
- **Region**:数据被划分为多个Region,每个Region包含一个或多个列族,是HBase中的基本管理单元。 - **StoreFile**:Region中的数据存储为多个StoreFile文件,它们是不可变的,只读的HFile格式文件。 - **MemStore...
1. 表与Region:HBase中的数据存储在表中,每个表由多个Region组成。Region是表的物理分割,根据行键(Row Key)的排序分配到不同的Region服务器上,确保数据的分布均匀。 2. Region服务器:Region服务器是HBase的...
Region是HBase表中的一种逻辑划分,每个Region包含一定数量的列族(Column Family)。 2. **HRegion**:它是HBase表的基本分区单位,每个Region包含了一个或多个Store,每个Store对应于一个列族。 3. **Store**:Store...
在HBase的生命周期中,当Region的MemStore达到一定大小后,会触发flush操作,此时内存中的数据将被写入HLog,随后形成一个新的HFile存储在HDFS上。这个过程确保了即使在RegionServer宕机的情况下,数据也不会丢失,...
文档中的每个章节都提供了足够的细节,旨在帮助用户从零开始深入了解HBase,并能够应对实际工作中的各种问题。 2. HBase的安装模式 HBase提供了三种安装模式,分别是独立模式(Standalone)、伪分布式模式(Pseudo-...
Region是HBase中进行数据分布和负载均衡的单位,如果当前集群中表的Region数量少于RegionServer的数量,那么可以考虑对Region进行切分,并尽量分配到不同的RegionServer上,以此提高系统的并发处理能力。然而,如果...
3. **HBase配置调整**:例如增大`hbase.hregion.max.filesize`以控制Region大小,调整`hbase.regionserver.handler.count`以增加处理线程数,或者优化`hbase.hregion.memstore.flush.size`以平衡内存和磁盘IO。...