今天发现hbase在写入一张新表时,写入过程中时常会出现一段连续的时间无法写入数据,时间长达10s以上。经过查看region server日志发现有如下记录:
2011-04-18 14:50:22,942 INFO org.apache.hadoop.hbase.regionserver.HRegion: Blocking updates for 'IPC Server handler 6 on 60020' on region data1,70712707089004,1303109282990.da1eccd9d9ebf0f8bfe1116fe7046763.: memstore size 128.1m is >= than blocking 128.0m size
2011-04-18 14:50:22,944 INFO org.apache.hadoop.hbase.regionserver.HRegion: Blocking updates for 'IPC Server handler 4 on 60020' on region data1,70712707089004,1303109282990.da1eccd9d9ebf0f8bfe1116fe7046763.: memstore size 128.3m is >= than blocking 128.0m size
2011-04-18 14:50:22,955 INFO org.apache.hadoop.hbase.regionserver.HRegion: Blocking updates for 'IPC Server handler 8 on 60020' on region data1,70712707089004,1303109282990.da1eccd9d9ebf0f8bfe1116fe7046763.: memstore size 128.3m is >= than blocking 128.0m size
2011-04-18 14:50:22,955 INFO org.apache.hadoop.hbase.regionserver.HRegion: Blocking updates for 'IPC Server handler 7 on 60020' on region data1,70712707089004,1303109282990.da1eccd9d9ebf0f8bfe1116fe7046763.: memstore size 128.3m is >= than blocking 128.0m size
查找了原代码,在HRegion中发现如下片断:
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() + "'");
}
}
原来是因为region server在写入时会检查每个region对应的memstore的总大小是否超过了memstore默认大小的2倍(hbase.hregion.memstore.block.multiplier决定),如果超过了则锁住memstore不让新写请求进来并触发flush,避免产生OOM。由于在flush时还会触发compact/split等操作。因此这个过程通常比较长,必须要紧持到对应的memstore完全刷新到磁盘才会结束,因此regionserver会睡眠10s再检查memstore是不是低于阀值。
对于在线应用来说,10s的时间是不可接受的,但这个过程确实非常漫长,因此可以调整以下配置以减少或者避免这种情况的出现。
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>8</value>//内存充足确保不会产生OOM的情况下,调大此值
</property>
<property>
<name>hbase.server.thread.wakefrequency</name>
<value>100</value>//减少睡眠等待时间,默认值为10000
</property>
分享到:
相关推荐
批量操作是另一个显著影响HBase写入性能的因素。在单条put操作与批量put操作之间,后者可以明显减少客户端到RegionServer的RPC连接数,从而提高写入性能。HBase提供的批量put接口能够将多个写入请求打包,一起处理,...
HBase的RegionServer处理器数量直接影响着写入性能。默认情况下,HBase的RegionServer处理器数量为10,可以根据实际情况调整这个值。例如,将Handler Count设置为100,可以明显提高写入性能。 调整HFile Block ...
通过对HBase数据插入性能的深度分析与实验验证,我们不仅揭示了其背后复杂而精妙的内部机制,还发现了影响性能的关键因素。HBase的Rowkey选择、集群调优策略、region split与compaction机制等,都是提升其性能表现不...
从HDFS中读文件,用groupby进行sort,然后写入Hbase中
- **Elapsed time in milliseconds**:460,290 毫秒,这是随机读取1048570行数据所花费的时间,比写入时间要长,说明HBase在随机读取上的性能相对较低。 - **Row count**:与写入测试相同,读取了1048570行数据,...
"HBase性能测试详细设计文档及用例" 本文档旨在详细介绍HBase性能测试的设计文档和实践经验,涵盖了HBase性能测试需要注意的一些参数设置和测试用例。下面是从该文档中提炼的相关知识点: 1.1 Pre-Creating ...
使用spark读取hbase中的数据,并插入到mysql中
本文将深入探讨HBase性能优化的各种策略,旨在帮助你提升数据操作的效率。 一、硬件优化 1. **磁盘选择**:HBase对I/O性能要求较高,因此推荐使用SSD硬盘,以减少读写延迟。 2. **内存配置**:合理分配HBase的堆...
- 当柱族数量达到1000时,实验出现超时,表明在大量柱族下,HBase的性能受到明显影响。 #### 结论 HBase在处理大量柱族时面临性能挑战,特别是在高柱族数量下的写入和读取操作。然而,通过合理配置和避免极端使用...
* IO 性能优化:HBase 中的 IO 操作是影响性能的关键因素。可以通过调整 HBase 的 RegionServer 配置、Compaction 机制和 Flush 机制来优化 IO 性能。 * RegionServer 配置:RegionServer 的配置对 HBase 的性能有很...
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable...
在HBase的使用中,如果直接将时间戳作为行健,会导致写入单个region时出现热点问题。因为HBase的rowkey是有序存储,时间集中会导致同一时间戳的数据集中到一个region中,导致该region成为热点,其他region访问速度变...
在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...
在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...
同时,可以调整hbase.hregion.percolumnfamilyflush.size.lower.bound来控制最小flush阈值,避免过小的flush操作影响性能。 多盘配置也是提升性能的重要方式,如启用多个WAL(Write-Ahead Log)(HBASE-5699)。...
Phoenix on HBase 是一个基于 HBase 的高性能数据处理引擎,它可以提供快速的数据查询和写入性能。在本报告中,我们对 Phoenix on HBase 的性能进行了测试,以探索其在数据查询和写入方面的特性和限制。 测试环境 ...