HBase - HFile文件合并、Region分裂和负载均衡机制详解(附布隆过滤器应用)
作者:hangge | 2024-11-20 08:30
1,HFile 介绍
(1)HFile 是 HBase 中重要的一个存在,可以说是 HBase 架构中最小的结构,HBase 的底层数据都在 HFile 中。HFile 从根本上来说是 HDFS 中的文件,只是它有自己特殊的格式。
(2)HFile 文件由 6 部分组成:
- Data(数据块):保存表中的数据(key-value 的形式),这部分可以被压缩,每个数据块都有一个 Magic 头,负责存储偏移量和第一个 Key。
- Meta(元数据块):存储用户自定义的 key-value。
- File Info:定长,记录了文件的一些元信息,例如:AVG_KEY_LEN,AVG_VALUE_LEN,LAST_KEY 等。
- Data Index(数据块索引):记录了每个数据块(Data)的起始索引。
- Meta Index(元数据块索引):记录了每个元数据块(Meta)的起始索引。
- Trailer:定长,用于指向其他数据块的起始点。
2,HFile compaction(合并)机制
(1)当 MemStore 超过阀值的时候,就会持久化生成一个(StoreFile)HFile。因此随着数据不断写入,HFile 的数量将会越来越多,HFile 数量过多会降低读性能,因为每次查询数据都需要加载多个 HFile 文件。为了避免对读性能的影响,可以对这些 HFile 进行合并操作,把多个 HFile 合并成一个 HFile。
(2)合并操作需要对 HBase 中的数据进行多次的重新读写,这个过程会产生大量的 IO。因此可以发现合并机制的本质就是以 IO 操作换取后续读性能的提高。
(3)合并操作分为 major(大合并)和 minor(小合并)两种。
- minor(小合并):只做部分文件的合并操作,生成新文件设置成激活状态,然后删除老的 HFile 文件。小合并的过程一般较快,而且 IO 相对较低。
- major(大合并):对 Region 下的所有 HFile 执行合并操作,最终的结果是合并出一个 HFile 文件。在生成新的 HFile 时,会忽略掉已经标记为删除的数据、ttl 过期的数据、版本超过限定的数据。大合并会产生大量的 IO 操作,对 HBase 的读写性能产生较大影响。
注意:一般情况下,大合并会持续很长时间,整个过程会消耗大量系统资源,对上层业务有比较大的影响。因此线上业务都会关闭自动触发大合并功能,改为手动在业务低峰期触发。
3,Region Split(分裂)机制
(1)前面我们分析了 HFile 文件的合并机制,当 HFile 文件合并多次之后,会导致 Region 中的数据过大,此时就需要涉及 Region 的分裂机制了。
- 当 HBase 中的一个表刚被创建的时候,HBase 默认只会分配一个 Region 给这个表。也就是说这个时候,所有的读写请求都会访问到同一个 RegionServer 中的同一个 Region 中,出现读写热点问题。
- 并且当 Region 管理的数据量过多,或 HFile 文件较大时,都会影响性能。
- 为了达到负载均衡,当 Region 达到一定的大小时就会将一个 Region 分裂成两个新的子 Region,并对父 Region 进行清除处理。
- HMaster 会根据 Balance 策略,重新分配 Region 所属的 RegionServer,最大化的发挥分布式系统的优点。
(2)触发 Region Split 的条件:
- ConstantSizeRegionSplitPolicy (0.94 版本前):
- 一个 Region 中最大 HFile 文件的大小大于设置的阈值(hbase.hregion.max.filesize)之后才会触发切分,HFile 文件大小为压缩后的文件大小(针对启用压缩的场景),默认文件大小的阈值为 10G。
- 这种策略简单粗暴,但是弊端相当大。
- 阈值设置偏大的话,对大表友好,小表可能不会触发分裂,极端情况下小表可能就只会有一个 Region。
- 阈值设置偏小的话,对小表友好,但一个大表可能会在集群中产生大量的 Region,对于集群管理来说不是好事。
- IncreasingToUpperBoundRegionSplitPolicy (0.94 版本 ~ 2.x 版本默认切分策略):
- 一个 Region 中最大 HFile 文件的大小大于设置的阈值就会触发切分,区别是这个阈值并不像 ConstantSizeRegionSplitPolicy 是一个固定的值,这里的阈值是会不断调整的。调整规则和 Region 所属表在当前 RegionServer 上的 Region 个数有关系 。
- 公式:调整后的阈值 = Region 个数的 3 次方 * flush_size * 2
- 注意:这里的阈值不会无限增大,会通过 hbase.hregion.max.filesize 来进行限制,不能超过这个参数的大小。
- 这种策略能够自适应大小表,集群规模大的情况下,对大表很优秀,对小表会产生大量小 Region(比第一种策略好一些)。
4,Region Balance(负载均衡策略)
(1)Region 分裂之后就会涉及到 Region 的负载均衡。
- HBase 的 HMaster 进程会自动根据指定策略挑选出一些 Region,并将这些 Region 分配到负载比较低的 RegionServer 上。
- 由于 HBase 的所有数据都是写入到 HDFS 文件系统中的, 因此 HBase 的 Region 移动其实是非常轻量级。在做 Region 移动的时候,保持这个 Region 对应的 HDFS 文件位置不变,只需要将 Region 的元数据分配到对应的 RegionServer 中即可。
(2)官方目前支持两种挑选 Region 的策略 DefaultLoadBalancer 和 StochasticLoadBalancer:
- DefaultLoadBalancer:这种策略能够保证每个 RegionServer 中的 Region 个数基本上都相等。
- StochasticLoadBalancer :这种策略非常复杂,简单来讲是一种综合权衡 6 个因素的均衡策略。
采用 6 个因素加权的方式算出一个代价值,这个代价值用来评估当前 Region 分布是否均衡,越均衡代价值越低。
- 每台服务器读请求数(ReadRequestCostFunction)
- 每台服务器写请求数(WriteRequestCostFunction)
- Region 个数(RegionCountSkewCostFunction)
- 移动代价(MoveCostFunction)
- 数据 Locality(TableSkewCostFunction)
- 每张表占据 RegionServer 中 Region 个数上限(LocalityCostFunction)
附:BloomFilter 布隆过滤器
1,布隆过滤器介绍
(1)布隆过滤器是一种比较巧妙的概率型数据结构,可以用来告诉你 “某样东西一定不存在或者可能存在”。
(2)也就是说如果它告诉你某样东西不存在的话就一定不存在。如果它告诉你某样东西存在,也可能实际是不存在的。
2,布隆过滤器在 HBase 中的应用
(1)布隆过滤器是 hbase 中的高级功能,它能够减少特定访问模式(get/scan)下的查询时间。进而提高 HBase 集群的吞吐率。
- 当我们随机查询数据时,如果采用 HBase 的块索引机制,HBase 会加载很多块文件。
- 如果采用布隆过滤器后,它能够准确判断该 HFile 的所有数据块中,是否含有我们查询的数据,从而大大减少不必要的块加载,进而提高 HBase 集群的吞吐率。
(2)对于 HBase 而言,当我们选择采用布隆过滤器之后,HBase 会在生成 HFile 时包含一份布隆过滤器结构的数据,开启布隆过滤器会有一定的存储及内存开销。但是在大多数情况下,这些负担相对于布隆过滤器带来的好处来说是可以接受的。
全部评论(0)