今天同事问到hbase中in-memory属性的作用,以前没有注意过,今天仔细看了下代码:
// 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--;
}
hbase内部的blockcache分三个队列:single、multi以及memory,分别占用25%,50%,25%的大小。这涉及到family属性中的in-memory选项,默认是false。
设为false的话,第一次访问到该数据时,会将它写入single队列,否则写入memory队列。当再次访问该数据并且在single中读到了该数据时,single会升级为multi
这三个队列其实是在共用blockcache的资源,区别是在LRU淘汰数据时,single会优先淘汰,其次为multi,最后为memory。
所以结论有两点:
1 同一个family不会占用全部的blockcache资源
2 当某些family特别重要时,可以将它的in-memory设为true,单独使用一个缓存队列,保证cache的优先使用
分享到:
相关推荐
HBase中的行键按照二进制顺序进行排序,这种排序方式是从左到右逐字节比较的,这种方式确保了数据的高效检索和排序。 3. **HBase的数据存储基础** HBase构建在Hadoop的HDFS之上,这意味着HBase利用HDFS来存储其...
BlockCache 是 HBase 中的一种缓存机制,用于存储经常访问的数据。通过调整 BlockCache 的大小,可以提高 HBase 的读取性能。 3. 读写请求数 读写请求数是一个重要的性能指标,通过观察读写请求数,可以了解每台 ...
冷数据则不进入缓存或者缓存优先级较低。 5. **混合存储架构**:采用如Intel Optane DC Persistent Memory等新型存储介质,构建混合存储架构,将热数据存储在高速内存中,冷数据保留在硬盘上,兼顾性能和成本。 ...
这需要在hbase-site.xml文件中的hbase.coprocessor.master.classes属性里添加相应的类名和优先级。 知识点三:MOB的管理 HBase 2.0+通过引入MOB特性,显著地改善了大规模对象数据的存储和处理性能。MOB的启用包括...
### HBase源码分析 #### 一、HBase性能测试要点与分析 ##### 1.1 测试环境 ...以上是对HBase源码中Master启动过程的部分解析,这些步骤有助于理解HBase在启动时如何初始化Master组件,并准备接收客户端请求。
- **列族**(Column Family):HBase中的数据被组织在多个列族中,每个列族存储特定类型的数据。 - **单元格值**:存储在列族中的数据,通常以字节数组形式存储。 - **示例**:例如,一个表可能有用户信息列族和订单...
BlockCache的三个优先级队列(Single、Multi、InMemory)分别对应不同访问频率的Block,以提高缓存利用率并降低Scan操作带来的影响。 综上所述,HBase的运维涉及多个层面,包括Region的管理和调整、缓存策略优化、...
- 从优先级队列中读取请求(Call),调用对应的Call方法获取响应值,并通过doRespond方法处理请求。 - 启动额外的Handler线程(默认为0)以优先处理高优先级任务。 5. **Zookeeper Watcher注册:** - 注册...
4. **时间戳(Timestamp)**:每个单元格可以有多个版本,不同版本的数据通过时间戳区分,最新版本的数据优先级最高。 5. **Region**:HBase将表水平分割成多个Region,每个Region负责一部分Rowkey范围内的数据。...
此外,为了提高数据访问效率,数据会被分层存储,例如,将热数据存放在高速缓存或内存中,而冷数据则存储在硬盘或者更低成本的存储介质上。这种分层存储策略可以有效平衡性能与成本。 在数帆数据中台,大数据存储...
Channel组件也支持Plugin扩展,支持事务和提供缓存队列功能,并且已经有MemoryChannel、FileChannel、JDBCChannel等多种实现。Sink组件同样支持Plugin扩展,有多种实现方式,如HDFS和HBase等。 Flume中的事务处理...
- **数据存储**: 存储 HBase 中的部分数据,提供快速检索的能力。 **性能考量**: - **查询峰值**: 根据业务需求确定 ES 的查询峰值。 - **服务器配置**: ES 的服务器配置需要根据数据量和查询频率来调整。 **与 ...
- 当Solr构建在HBase之上时,还需要考虑HBase的性能调优策略,以确保整个系统的高效运行。 ##### 12.8.4 Solr over HDFS调优建议 - 类似地,当Solr使用HDFS作为底层存储时,也需要注意HDFS的性能调优,以保证数据...
- **Sink**:负责将 Channel 中的数据发送到目的地,例如 HDFS、HBase 或其他日志存储系统。 2. **Flume 的启动命令** 使用 `bin/flume-ng agent` 命令启动 Flume,需要指定配置文件路径、Agent 名称以及日志级别...
- **中间结果存储**: Spark将中间结果缓存在内存中,MapReduce则存储在磁盘上。 - **容错机制**: Spark通过RDD的血统机制自动恢复失败的任务。 9. **多线程使用**: - Java中的多线程编程主要通过`Thread`类或`...
5. **算法设计**:网络抓取涉及到一系列算法,如深度优先搜索(DFS)、广度优先搜索(BFS),以及反向链接分析、PageRank算法等,用于决定抓取策略和优先级。 6. **数据存储**:抓取到的数据可能非常庞大,因此需要...
优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC机制 GC收集器类型 串行 CMS ...
它的出现打破了Oracle、MySQL等非分布式设计数据库的局限,通过分层架构,使得缓存和数据库能分别处理各自擅长的业务场景。 在【标题】和【描述】中,我们可以看出TiDB的核心优势在于: 1. **弹性伸缩**:TiDB支持...