HBase Compaction机制

本文深入探讨HBase中的Compaction机制,解释minorcompaction和majorcompaction的区别及触发条件,详细分析参数如何影响StoreFile合并,提升读写效率。

转载自:https://blog.youkuaiyun.com/hljlzc2007/article/details/10980949
    https://blog.youkuaiyun.com/xiaolang85/article/details/76977309

  Hbase为了防止小文件(被刷到磁盘的menstore)过多,提高读写数据的效率,hbase需要在必要的时候将这些小的store file合并成相对较大的store file,同时清除过期和删除数据,这个过程就称之为compaction。
  在hbase中,主要存在两种类型的compaction:minor compactionmajor compaction

  major compaction的功能是将所有的store file合并成一个,触发major compaction的可能条件有:major_compact 命令、majorCompact()API、region server自动运行(相关参数:hbase.hregion.majoucompaction默认为24 小时、hbase.hregion.majorcompaction.jetter默认值为0.2,防止region server 在同一时间进行major compaction)。hbase.hregion.majorcompaction.jetter参数的作用是:对参数hbase.hregion.majoucompaction规定的值起到浮动的作用,假如两个参数都为默认值24和0,2,那么major compact最终使用的数值为:19.2~28.8 这个范围。

  minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。minor compaction的运行机制要复杂一些,它由一下几个参数共同决定:
  hbase.hstore.compaction.min :默认值为 3,表示至少需要三个满足条件的store file时,minor compaction才会启动
  hbase.hstore.compaction.max 默认值为10,表示一次minor compaction中最多选取10个store file
  hbase.hstore.compaction.min.size 表示文件大小小于该值的store file 一定会加入到minor compaction的store file中
  hbase.hstore.compaction.max.size 表示文件大小大于该值的store file 一定会被minor compaction排除
  hbase.hstore.compaction.ratio 将store file 按照文件年龄排序(older to younger),minor compaction总是从older store file开始选择,如果该文件的size 小于它后面hbase.hstore.compaction.max 个store file size 之和乘以 该ratio,则该store file 也将加入到minor compaction中。

HBase 的写入机制是一个复杂但高效的过程,它涉及多个组件的协同工作以确保数据的可靠性和一致性。以下是 HBase 写入数据的工作原理及流程: 当客户端发起一个写入请求时,首先需要确定目标 RegionServer。这一步骤通过查询 `hbase:meta` 表来完成,该表记录了所有 Region 与 RegionServer 之间的映射关系。客户端使用 `HConnection` 接口中的 `locateRegion` 方法来定位负责特定 rowkey 的 RegionServer [^4]。 一旦找到了正确的 RegionServer,客户端就会将数据发送给它。在 RegionServer 接收到数据后,并不会立即将其写入 HDFS,而是先缓存到内存中的 MemStore 中。MemStore 是每个列族(Column Family)都有一个的结构,用于临时存储新到达的数据 [^5]。 与此同时,为了保证数据的安全性,在向 MemStore 添加数据之前,HBase 还会执行写前日志(Write-Ahead Log, WAL)。这意味着所有的更改都会被记录在一个称为 HLog 文件中,这个文件位于 HDFS 上。如果发生故障导致 MemStore 数据丢失,则可以通过重放 WAL 来恢复这些数据 [^1]。 随着 MemStore 中的数据量增长,当达到一定阈值时,系统会触发 flush 操作,把 MemStore 中的内容持久化为一个新的 StoreFile 并保存至 HDFS。随着时间推移和更多数据的写入,会有更多的 StoreFiles 被创建出来 。 此外,HBase 还实现了 Compaction 机制,用来合并多个小的 StoreFiles 成较大的文件,以此减少磁盘 I/O 并提高读取性能。Compaction 分为 Minor 和 Major 两种类型:Minor Compaction 只合并少量相邻的小文件;而 Major Compaction 则会对整个 Region 内的所有 StoreFiles 进行彻底整合 [^1]。 综上所述,HBase 的写入流程包括以下几个关键步骤: - 定位合适的 RegionServer。 - 将数据写入 WAL 以确保持久性。 - 把数据插入到对应的 MemStore。 - 当 MemStore 达到设定大小时执行 Flush 操作生成新的 StoreFile。 - 定期进行 Compaction 来优化存储效率和查询速度。 ```java // 示例代码 - 使用 Java API 向 HBase 表中插入数据 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; public class HBaseWriteExample { public static void main(String[] args) throws Exception { // 创建配置对象并设置ZooKeeper相关信息 Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost:2181"); // 建立连接 try (Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("my_table"))) { // 准备要插入的数据 Put put = new Put(Bytes.toBytes("row1")); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qualifier"), Bytes.toBytes("value")); // 执行插入操作 table.put(put); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值