/**
* Eviction method.
*/
void evict() {
// Ensure only one eviction at a time
if (!evictionLock.tryLock())return ;
try {
evictionInProgress =true ;
long currentSize =this .size.get();
long bytesToFree = currentSize – minSize();
if (LOG.isDebugEnabled()) {
LOG.debug(“Block cache LRU eviction started; Attempting to free ” +
StringUtils.byteDesc(bytesToFree) + ” of total=” +
StringUtils.byteDesc(currentSize));
}
if (bytesToFree <= 0)return ;
// Instantiate priority buckets
BlockBucket bucketSingle =new BlockBucket(bytesToFree, blockSize,
singleSize());
BlockBucket bucketMulti =new BlockBucket(bytesToFree, blockSize,
multiSize());
BlockBucket bucketMemory =new BlockBucket(bytesToFree, blockSize,
memorySize());
// Scan entire map putting into appropriate buckets
for (CachedBlock cachedBlock : map.values()) {
switch (cachedBlock.getPriority()) {
case SINGLE: {
bucketSingle.add(cachedBlock);
break ;
}
case MULTI: {
bucketMulti.add(cachedBlock);
break ;
}
case MEMORY: {
bucketMemory.add(cachedBlock);
break ;
}
}
}
PriorityQueue<BlockBucket> bucketQueue =
new PriorityQueue<BlockBucket>(3);
bucketQueue.add(bucketSingle);
bucketQueue.add(bucketMulti);
bucketQueue.add(bucketMemory);
int remainingBuckets = 3;
long bytesFreed = 0;
BlockBucket bucket;
while ((bucket = bucketQueue.poll()) !=null ) {
long overflow = bucket.overflow();
if (overflow > 0) {
long bucketBytesToFree = Math.min(overflow,
(bytesToFree – bytesFreed) / remainingBuckets);
bytesFreed += bucket.free(bucketBytesToFree);
}
remainingBuckets–;
}
if (LOG.isDebugEnabled()) {
long single = bucketSingle.totalSize();
long multi = bucketMulti.totalSize();
long memory = bucketMemory.totalSize();
LOG.debug(“Block cache LRU eviction completed; ” +
“freed=” + StringUtils.byteDesc(bytesFreed) + “, ” +
“total=” + StringUtils.byteDesc(this .size.get()) + “, ” +
“single=” + StringUtils.byteDesc(single) + “, ” +
“multi=” + StringUtils.byteDesc(multi) + “, ” +
“memory=” + StringUtils.byteDesc(memory));
}
}finally {
stats.evict();
evictionInProgress =false ;
evictionLock.unlock();
}
}
|
相关推荐
HBase的Block Cache是 RegionServer 中的一块缓存区域,用于存储频繁访问的数据块。增大Block Cache的大小可以提高读取性能。默认情况下,HBase的Block Cache大小为0.0,可以根据实际情况调整这个值。例如,将Block ...
BlockCache 是 HBase 中的一种缓存机制,用于存储经常访问的数据。通过调整 BlockCache 的大小,可以提高 HBase 的读取性能。 3. 读写请求数 读写请求数是一个重要的性能指标,通过观察读写请求数,可以了解每台 ...
此外,HBase的内存管理还包括了BlockCache与Memstore的大小比例配置,一般默认BlockCache为20%,Memstore为40%。在读密集型应用中,可以增大BlockCache,减小Memstore,以优化读取性能。BlockCache的三个优先级队列...
HBase中设计有MemStore和BlockCache,分别对应列族/Store级别的写⼊缓存,和RegionServer级别的读取缓存。如果RowKey过 长,缓存中存储数据的密度就会降低,影响数据落地或查询效率。 1.2 hbase的设计原则以及解决...
- 观察与确认:分析缓存未命中率和配置,同时关注GC日志,评估BlockCache配置的有效性。 - 优化建议:若内存小于20GB,选择LRUBlockCache;否则,考虑使用BucketCache的offheap模式,以减少GC影响。HBase 2.0的...
hbase 常用参数含义,默认值,调优建议(必须参数,split,compaction,blockcache,memstore flush,hlog,zookeeper,其他,等相参数名称、含义、默认值、调优建议)
BlockCache用于缓存数据块,合理设置可以显著提高读取速度,但也要注意不要过度占用内存,以免影响其他服务。 读写性能优化方面,可以通过批处理、预读取、优化Scan操作等方式提升。例如,使用Put批量写入数据比单...
* hfile.block.cache.size:storefile 的读缓存占用内存的大小百分比,默认值为 0.2,可以根据实际情况调整,以提高数据读的性能。 HBase 的优化需要从多方面考虑,包括 Linux 系统、JVM 配置、HBase 配置等方面。...
【描述】:这份文档探讨了HBase在实际应用中的使用情况以及如何实现高可用性,特别关注了平安科技在HBase上的实践。 【标签】:HBase, 高可用性, 数据存储, 性能优化, 数据迁移 【正文】: HBase作为一种分布式列...
每个Region包含一个或多个列族,数据在磁盘上以文件形式存储,通过BlockCache优化读取性能。 **面向列和面向行** HBase既支持列式存储,方便对某一列族内的数据进行快速访问,也支持行级操作,可以在一行内进行多列...
例如,使用HBase Shell创建表时,可以指定表名、列族,还可以设置版本数(VERSIONS)、生存时间(TTL)、是否启用BlockCache,甚至预先分割Region以优化表的分布。插入数据时,PUT命令需要指定表名、行键(RowKey)...
HBase的存储引擎基于LSM-Like树,这使得一次范围查询可能涉及到多个Region(分片)、BlockCache(内存缓存)以及多个HFile(数据存储文件)。在读取过程中,HBase不仅要处理多版本的数据,还要处理已标记为删除但未...
随着数据量的增长,可能需要对HBase进行性能优化,如调整Region大小、设置合理的RowKey、利用BlockCache等。这需要根据具体应用场景来设定。 9. 监控与故障排查 了解如何监控HBase的性能和状态至关重要,可以使用...
此外,监控和调整HBase的各项参数也是关键,如major_compaction执行周期、handler.count和block.cache.size等。 通过上述最佳实践,读者不仅能掌握HBase的基本操作,还能理解如何根据实际需求进行定制化优化,从而...
2. BlockCache:读缓存,缓存最常访问的数据。 3. MemStore:写缓存,定期将数据flush到磁盘形成HFile。 4. HFile:在HDFS上存储的有序key-value数据。 【HBase的存储机制】 表由行组成,行由列族构成,列族由列...
- **BlockCache**:调整BlockCache大小,优化热点数据的缓存命中率。 - **Scan优化**:限制scan返回的结果数量,避免一次性加载大量数据;设置合理的filter以减少不必要的数据扫描。 4. **数据计算** - **...
这个过程包括在BlockCache中查找索引树,确定RowKey所在的BlockOffset和BlockSize,加载Block并进行进一步的扫描操作。 在Seekrowkey之后,数据读取进入实际的Block读取和解码阶段。Block读取可能利用BlockCache...
- 监控指标涵盖连接数、响应时间、处理时间、读写请求数、请求大小、运行线程数、flush和compaction队列长度、Blockcache命中率、Hlog文件大小和数量、Storefile数量和大小等。 - 通过模拟用户行为检测异常,比如...
监控指标包括但不限于连接数、响应时间、处理时间、读写请求数、请求大小、运行线程数、flush和compaction队列长度、Blockcache命中率、Hlog大小和数量、Storefile数量和大小等。此外,还通过模拟用户操作来检测异常...