总结《HBase原理与实践》第七、八章

目录

1. Compaction实现

1.1 Compaction基本工作原理

1.1.1Compaction触发条件

1.1.2待合并HFile集合选择策略

2. 负载均衡实现

3. Region合并

4. Region的分裂

4.1 Region分裂触发条件

4.2 Region分裂准备工作 ---- 寻找分裂点

5. 负载均衡

5.1 负载均衡策略


1. Compaction实现

Compaction核心功能是将小文件合并成大文件,提升读取效率。

1.1 Compaction基本工作原理

Compaction是从一个Region的一个Store中选择部分HFile文件进行合并。先从这些待合并的数据文件中依次读出KeyValue,再由小到大排序后写入一个新的文件。

Compaction分为 Major CompactionMinor Compaction

  • Minor Compaction  指选取部分小的、相邻的HFile,将它们合并成一个更大的HFile。
  • Major Compaction 将一个Store中所有的HFile合并成一个HFile,这个过程还会完全清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。

Major Compaction持续时间长,占用资源大,对业务读取有影响,推荐关闭Major Compaction,改在业务低峰期中手动触发。

Compaction的核心功能:

  1. 合并小文件,减少文件数
  2. 提高数据本地化率
  3. 清理无效数据

Compaction操作重写文件会带来很大的带宽压力以及短时间IO压力。Compaction就是使用短时间的IO消耗以及带宽消耗换取后续查询的低延迟。

1.1.1Compaction触发条件

1. flush操作  2. 周期性Compaction 3. 手动触发(一般是Major Compaction)

Compaction操作的源头来自flush操作,Compaction都是以Store为单位进行的。

1.1.2待合并HFile集合选择策略

选择合适的文件进行合并是整个Compaction的核心,因为合并文件的大小及其当前承载的IO数直接决定了Compaction的效果以及对整个系统其他业务的影响程度。

将比要进行Compaction的文件新的文件和大文件排除掉,触发条件手动触发和长时间没有进行Major Compaction。

 

2. 负载均衡实现

负载均衡是分布式集群设计的一个重要功能,只有实现了负载均衡,集群的可扩展性才能得到有效保证。

Hbase表的分片就是Region,HBase中Region迁移是一个非常轻量级的操作。所谓轻量级,是因为HBase的数据实际存储在HDFS上,不需要独立进行管理,因而Region在迁移的过程中不需要迁移实际数据,只要将读写服务迁移即可。

Region迁移的难点?

(1) Region迁移过程涉及多种状态的改变;(Region的状态如下图)(2)迁移过程中涉及Master、ZooKeeper(ZK)以及RegionServer等多个组件的相互协调。


Region的unassign(下线)的流程 上线的流程基本一样

  1. master生成事件并更新zookeeper,同时修改本地内存中该Region的状态为准备关闭。
  2. master发送rpc请求到region所在的RegionServer上,令其关闭该region。
  3. RegionServer接收到请求后,向zookeeper更新状态。
  4. master监听到zookeeper节点变动后,更新本地内存中该region的状态为正在关闭。
  5. regionServer关闭该region后,向zookeeper更新状态。
  6. master监听到zookeeper节点变动后,更新本地内存中该region的状态为下线。

Region状态变化涉及到三个组件:Master Zookeeper RegionServer

  • Master负责维护Region在整个操作过程中的状态变化,起到枢纽的作用。
  • RegionServer负责接收Master的指令执行具体unassign/assign操作。
  • Zookeeper 负责存储操作过程中的事件。ZooKeeper有一个路径为/hbase/region-in-transition的节点,Region如果进行了操作,会在这个节点生成一个子节点,并且Master会在这个节点监听,一旦发生任务事件,Master会监听并更新Region的状态。

Region In Transition

为什么要设置这些状态?

无论是unassign 还是 assign 都是由很多个子操作来完成的,涉及到多个组件之间协调完成,只有通过记录Region的状态,才能知道当前unassign 或者 assign 的进度。尤其是异常发生后,可以根据状态来进行恢复。

问:如何管理这些状态?

Region的这些状态会存在于一下三个区域: meta表,Master内存,zookeeper的region-in-transition 节点,并且作用不同。只有这三个状态保持一致,对应的Region才会正常工作,然后在很多异常情况下,Region在这三个状态不能保持一致,这就会出现Region-in-Transition(RIT)现象。

1. meta表只存储Region所在的RegionServer不存储中间状态,如果Region从RS1节点迁移到了RS2节点,那么meta表就只有Region于RS2节点的对应关系,如果中间发生异常,那么meta表就只有region与RS1的对应关系。

2. Master内存中存储整个集群所有的Region信息,这个可以看出这个Region当前以什么状态在那个RegionServer上,Master存储的状态都是RegionServer通过Zookeeper通知给Master的。所以Master上的状态时落后于Region真正的状态变化的。

注意,我们在HBase Master WebUI上看到的Region状态都来自于Master内存信息。

3. ZooKeeper中存储的是临时性的状态转移信息,作为Master和RegionServer之间反馈Region状态的通道。如果Master或者RegionServer发生异常,Zookeeper上存储的状态,会在新的Master启动后作为依据继续进行恢复服务。

在region迁移必然会发生短暂的RIT现象,但是这种场景并不需要人工干预。

3. Region合并

Region的合并主要流程:

  1. 客户端发送merge请求给Master。
  2. Master将待合并的Region都move到同一个RegionServer上。
  3. Master发送Merge请求到RegionServer。
  4. RegionServer启动一个本地事务执行merge操作。
  5. merge操作会将待合并的两个Region下线,下线的两个region文件将进行合并。
  6. 将这两个Region从hbase:meta中删除,并将新生成的Region添加到hbase:meta中。
  7. 将新region上线。

4. Region的分裂

Region分裂是HBase最核心的功能之一,是实现分布式可扩展性的基础。

4.1 Region分裂触发条件

  • 0.94版本之前默认分裂策略。一个Region中最大Store的大小超过设置阈值之后会触发分裂。(优点:小表不会产生很多region 缺点:大表会产生大量的Region)
  • 0.94版本~2.0版本默认分裂策略。一个Region中最大Store大小超过设置阈值就会触发分裂。这个阈值会不断调整,调整后的阈值大小和Region所属表在当前RegionServer上的Region个数有关系,这个阈值不会无限大,(优点:大表不会产生大量的Region,但是小表会产生很多region,并且分散在集群中)
  • 2.0版本默认分裂策略。分裂阈值大小和待分裂Region所属表在当前RegionServer上的Region个数有关系,如果Region个数等于1,分裂阈值为f lush size * 2(更加友好)

4.2 Region分裂准备工作 ---- 寻找分裂点

HBase对于分裂点的定义为:整个Region中最大Store中的最大文件中最中心的一个Block的首个rowkey。另外,HBase还规定,如果定位到的rowkey是整个文件的首个rowkey或者最后一个rowkey,则认为没有分裂点。

Region分裂过程因为没有涉及数据的移动,所以分裂成本本身并不是很高,可以很快完成。分裂后子Region的文件实际没有任何用户数据,文件中存储的仅是一些元数据信息——分裂点rowkey等。

父Region的数据迁移到子Region目录的时间?

迁移发生在子Region执行Major Compaction时。根据Compaction原理,从一系列小文件中依次由小到大读出所有数据并写入一个大文件,完成之后再将所有小文件删掉,因此Compaction本身就是一次数据迁移。子Region执行Major Compaction后会将父目录中属于该子Region的所有数据读出来,并写入子Region目录数据文件中。

父Region被删除的时间?

Master会启动一个线程定期遍历检查所有处于splitting状态的父Region,确定父Region是否可以被清理,检测线程首先会在meta表中读出所有split列为true的Region,并加载出其分裂后生成的两个子Region(meta表中splitA列和splitB列)。检查两个子Region是否还存在引用文件,如果都不存在引用文件就可以认为该父Region对应的文件可以被删除。

5. 负载均衡

5.1 负载均衡策略

(1)SimpleLoadBalancer策略

这种策略能够保证每个RegionServer的Region个数基本相等,假设集群中一共有n个RegionServer,m个Region,那么集群的平均负载就是average=m/n。

(2)StochasticLoadBalancer策略

考虑到几个权值

  • Region个数
  • Region负载
  • 读请求数
  • 写请求数
  • StoreFile大小
  • 数据本地率
  • 移动代价

系统使用这个代价值来评估当前Region分布是否均衡,越均衡代价值越低。HBase通过不断随机挑选迭代来找到一组Region迁移计划,使得代价值最小。

posted @ 2021-01-02 16:29  彬在俊  阅读(174)  评论(0编辑  收藏  举报