HBase Block Cache的重要实现细节和In-Memory Cache的特点

本文深入剖析HBase 0.94.1版本中BlockCache的工作原理,包括其如何根据预设的安全比例触发缓存清理操作,以及in-memory block与其他类型block的区别。通过实例说明如何合理设置IN_MEMORY参数以提高缓存利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文基于HBase 0.94.1的源码进行分析。本文原文连接: http://blog.csdn.net/bluishglc/article/details/21516067,转载请著明出处!

每load一个block到cache时,都会检查当前cache的size是否已经超过了“警戒线”,这个“警戒线”是一个规定的当前block cache总体积占额定体积的安全比例,默认该值是0.85,即当加载了一个block到cache后总大小超过了既定的85%就开始触发异步的evict操作了。

evict的逻辑是这样的:遍历cache中的所有block,根据它们所属的级别(single,multi,in-memory)分拨到三个优先级队列中,队头元素是最旧(最近访问日间值最小)的那个block。对这个三队列依次驱逐对头元素,释放空间。

所以说:in-memory的block与其他类型的block并无本质上的不同,它不会长久驻留cache而不被逐出cache, 当不断有新的in-memory的block被访问,而现有in-memory cache已达到上限时,旧的in-memory block就会被替换出去,除非,所有in-memory的block的总体积小于in-memory cache。

但是in-memory的block确实不同于其他两种block的地方在于它的这个“in-memory”特征是静态指定的(在column family上设置),不会像其他两种cache会因访问频率而发生改变,这就决定了它的独立性,另外两种block访问次数再多也不会被放到in-memory的区段里去,in-memory的block不管是第几次访问,总是被放置到in-memory的区段中。

从in-memory cache的这些特性上来看,需要特别强调的是:

1. 标记IN_MEMORY=>'true'的column family的总体积最好不要超过in-memory cache的大小(in-memory cache = heap size * hfile.block.cache.size * 0.85 * 0.25),特别是当总体积远远大于了in-memory cache时,会在in-memory cache上发生严重的颠簸。

2. 换个角度再看,普遍提到的使用in-memory cache的场景是把元数据表的column family声明为IN_MEMORY=>'true。实际上这里的潜台词是:元数据表都很小。其时我们也可以大胆地把一些需要经常访问的,总体积不会超过in-memory cache的column family都设为IN_MEMORY=>'true'从而更加充分地利用cache空间。就像前面提到的,普通的block永远是不会被放入in-memory cache的,只存放少量metadata是对in-memory cache资源的浪费(未来的版本应该提供三种区段的比例配置功能)。
<think>好的,用户现在想理解HBase列族参数的含义,特别是针对他们提供的参数列表。首先,我需要回顾之前提供的关于HBase列族的解析,结合用户给出的引用内容,特别是引用[1]中的表描述信息,里面包含了具体的参数。用户可能希望每个参数都有清晰的解释,以及这些参数如何影响HBase的性能数据管理。 用户的问题集中在参数的解释上,所以需要将每个参数逐一分析,说明其作用、默认值以及适用场景。例如,BLOOMFILTER设置为ROW,需要解释布隆过滤器的作用,以及ROWROWCOL的区别。还有像TTL设置为FOREVER,这意味着数据不会自动过期,而MIN_VERSIONSVERSIONS的组合需要解释清楚版本控制机制。 此外,用户可能希望了解如何根据业务需求调整这些参数,比如压缩算法选择不同的类型,或者调整块大小来优化读写性能。需要结合之前的回答中的最佳实践,比如列族数量控制冷热数据分离,来提供实际的应用建议。 还要注意用户提供的引用内容,比如引用[2]中的ROWPREFIXFILTER引用[3]中的删除操作,虽然这些不是直接相关,但可能需要确保在解释参数时没有冲突或遗漏。例如,KEEP_DELETED_CELLS设置为FALSE,说明删除的数据不会保留,这会影响使用时间戳查询历史数据的能力。 需要确保回答结构清晰,每个参数分点说明,可能用表格形式更直观。同时,生成的相关问题要针对参数调整、性能优化设计考虑,帮助用户进一步探索。最后,引用标记要正确对应到用户提供的引用源,确保信息的准确性。</think>### HBase列族参数详细解析(基于引用[1]的`INFO`列族配置) --- #### 一、核心参数解释(以`INFO`列族为例) | **参数** | **值** | **作用解析** | **最佳实践** | |-------------------------|-------------|------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | `NAME` | `INFO` | 列族标识符,命名需遵循`[a-zA-Z0-9_]+`规则 | 建议采用业务语义(如`USER_INFO`、`ORDER_DETAIL`) | | `BLOOMFILTER` | `ROW` | 布隆过滤器类型,可选`ROW`(行级过滤)或`ROWCOL`(行+列级过滤),加速数据存在性判断[^4] | 高频随机读场景建议`ROWCOL`,扫描场景可关闭 | | `IN_MEMORY` | `false` | 是否优先缓存到内存(BlockCache),适合高频访问的热数据 | 仅对极小规模热数据列族设为`true`(如用户画像核心字段) | | `VERSIONS` | `1` | 最大数据版本保留数,HBase默认只保留最新版本 | 需要历史版本追踪时需调大(如`VERSIONS=3`),需配合`MIN_VERSIONS`使用 | | `KEEP_DELETED_CELLS` | `FALSE` | 是否保留被标记删除的单元格 | 审计场景可设为`TRUE`,常规业务建议`FALSE`(引用3中的`delete`操作会物理删除) | | `DATA_BLOCK_ENCODING` | `NONE` | 数据块编码方式(如`DIFF`、`PREFIX`),可压缩存储空间 | 高基数列建议使用`PREFIX`编码 | | `COMPRESSION` | `NONE` | 压缩算法(`SNAPPY`/`GZIP`/`LZO`),减少存储空间占用 | 生产环境推荐`SNAPPY`(CPU占用与压缩率平衡) | | `TTL` | `FOREVER` | 数据存活时间(秒),超时自动删除 | 日志类数据建议设置(如`TTL => '2592000'`表示30天过期) | | `MIN_VERSIONS` | `0` | 最小保留版本数(即使数据过期也至少保留的版本数) | 需配合`VERSIONS``TTL`使用,如`VERSIONS=3, MIN_VERSIONS=1`保证至少存1个版本 | | `BLOCKCACHE` | `true` | 是否启用读缓存(BlockCache),缓存最近访问的数据块 | 读多写少场景建议开启,写入密集型场景可关闭部分列族 | | `BLOCKSIZE` | `65536` | HFile数据块大小(字节),影响磁盘IO效率缓存粒度 | 随机读多建议64KB,顺序扫描多可设为128KB | | `REPLICATION_SCOPE` | `0` | 数据复制范围(0表示不跨集群复制) | 跨集群同步需设为`1`(需配合HBase集群复制功能) | --- #### 二、关键参数组合应用场景 1. **高并发读优化组合** ```shell {BLOOMFILTER => 'ROWCOL', BLOCKCACHE => 'true', IN_MEMORY => 'true'} ``` 适用场景:用户实时查询系统(如订单状态查询) 2. **存储压缩优化组合** ```shell {COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'DIFF'} ``` 适用场景:日志存储场景(如引用2中的操作记录) 3. **数据版本控制组合** ```shell {VERSIONS => 5, MIN_VERSIONS => 1, TTL => '2592000'} ``` 适用场景:金融交易流水(需保留30天内的5个版本) --- #### 三、配置修改方法示例 通过HBase Shell动态修改参数(引用1的`INFO`列族): ```shell # 修改压缩算法为SNAPPY alter 'ZLXX:WT_TRADE_REFUND', {NAME => 'INFO', COMPRESSION => 'SNAPPY'} # 增加版本保留数到3 alter 'ZLXX:WT_TRADE_REFUND', {NAME => 'INFO', VERSIONS => 3} # 开启行+列布隆过滤器 alter 'ZLXX:WT_TRADE_REFUND', {NAME => 'INFO', BLOOMFILTER => 'ROWCOL'} ``` --- #### 四、参数与性能关系对比表 | **操作类型** | **关键参数** | **优化方向** | |---------------|---------------------------------------|-----------------------------| | 随机读 | `BLOOMFILTER=ROWCOL`, `BLOCKCACHE=true` | 减少磁盘IO | | 顺序扫描 | `BLOCKSIZE=131072`, `COMPRESSION=SNAPPY` | 提升吞吐量 | | 高频写入 | `BLOCKCACHE=false`, `COMPRESSION=LZO` | 降低写入延迟 | | 海量数据存储 | `DATA_BLOCK_ENCODING=PREFIX`, `VERSIONS=1` | 减少存储空间占用 | --- ### 相关问题 1. 如何通过HBase的`hbase-site.xml`全局配置列族默认参数? 2. `BLOOMFILTER`参数在哪些查询场景下会失效? 3. 列族的`BLOCKSIZE`与HDFS块大小(默认128MB)有什么关系? 4. 如何监控`BLOCKCACHE`命中率来优化列族配置?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laurence 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值