其他分享
首页 > 其他分享> > 总结《HBase原理与实践》第七、八章

总结《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

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

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分裂触发条件

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分布是否均衡,越均衡代价值越低。HBase通过不断随机挑选迭代来找到一组Region迁移计划,使得代价值最小。

标签:八章,第七,Region,RegionServer,分裂,Master,Compaction,HBase,region
来源: https://www.cnblogs.com/erlou96/p/14223176.html