大数据技术HBase----基本原理

HBase数模型

逻辑组织方式:,大表存储
表,
列族
列标识
单元格
版本

写入数据

在这里插入图片描述

读取数据

在这里插入图片描述

Region合并

在这里插入图片描述

Region的管理

所有Region与RegionServer形成一张映射表,即Meta表,由ZooKeeper管理。
每个RegionServer又管理分配给自己的Region数据块

Region的拆分

Region下数据存储的核心:Store
当Region的最大Store下的StoreFile(最大)大于设定的阈值,即开始Region的拆分。
在拆分时,不同的策略,只是设定阈值的方式不同
策略参数如下:
ConstantSizeRegionSplitPolicy;
Region中最大Store下的StoreFile大于配置项(hbase.hregion.max.filesize)时,触发拆分
IncreasingToUpperBoundRegionSplitPolicy;
阈值不断调整,与Region所属的表分布在该RegionServer上的Region的个数有关
SteppingSplitPolicy;
若只有一个Region,则阈值为flushsize*2;
否则,阈值为MaxRegionFileSize
DisabledRegionSplitPolicy;
关闭拆分策略,进行手动拆分
如下,创建表时指定拆分策略:

hbase(main):039:0> create 'day03',{NAME=>'StuInfo',VERSIONS=>'3'},{NAME=>'GRADES',VERSIONS=>'5',blockcache=>'true'},{SPLIT_POLICY=>'org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy'}

hbase(main):038:0> desc 'day03'
Table day03 is ENABLED                                                              
day03, {TABLE_ATTRIBUTES => {METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase
.regionserver.ConstantSizeRegionSplitPolicy'}}                                      
COLUMN FAMILIES DESCRIPTION                                                         
{NAME => 'GRADES', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESS
ION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPL
ICATION_SCOPE => '0'}                                                               
{NAME => 'StuInfo', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEE
P_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRES
SION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REP
LICATION_SCOPE => '0'}                                                              
2 row(s) in 0.0110 seconds

拆分步骤:
RegionServer负责拆分;

  1. 待拆分的Region下线,并阻止其接收客户端请求;同时HMaster检测到该Region为splitting状态。
  2. 在该父Region目录下,创建两个引用文件,分别指向父Region的起始行、结束行;但此时并不拷贝父Region的数据。
  3. 在HDFS上建立两个子Region目录,并分别拷贝上一步的两个引用文件,然后各自拷贝父Region一半的数据,拷贝完成,则删除两个引用文件。
  4. 子Region创建完成,将其元数据更新到Meta表中,并删除父Region的元数据。
  5. 父Region的拆分信息更新到HMaster中,子Region开始提供服务。

Region的合并

  1. 为什么要合并?
    随着表的增大、Region的不断拆分,Region的数量不断增多,过多的Region会导致如下问题:
      1.1 memstore数量增多,在RegionServer的内存一定的情况下,每个memstore的大小会缩小,就会出现数据频繁地memstore刷新到storefile中,从而影响客户端的请求。
      1.2 Region元数据增多,Meta表增大,增加zookeeper的负担。
    所以RegionServer中的Region达到一定的阈值,就会进行Region的合并。

  2. 合并的步骤:
       2.1 客户端发送Region合并的请求,给HMaster.
       2.2 HMaster将需要合并的Region移到一起,然后发送Region合并请求给RegionServer。
       2.3 RegionServer将需要合并的Region下线,然后进行合并。
       2.4 更新Meta表,删除旧的Region元数据,更新新合并的Region的元数据。
       2.5 Region合并的信息更新给HMaster,同时新Region上线提供服务。

负载均衡

分布式系统中,负载均衡是一个重要的功能。
HBase通过Region的分配,实现负载均衡。
负载均衡分为两步:

  1. 生成负载均衡计划表
  2. 按照计划表,分配Region

在HMaster内部有一套负载均衡评分算法,结合RegionServer上Region的数量、memstore的大小、storefile的大小、数据本地性等几个维度对集群进行评分,评分越低,集群负载越合理。
当确定需要负载均衡时,根据不同的均衡策略,选择Region,重新分配,然后再对整个表评分,若还没有达到标准,则继续循环进行负载均衡。

负载均衡策略:
RandomRegionPicker:
随机选择两个RegionServer上的Region进行交换
LoadPicker:
选择Region数量最多、最少的两个RegionServer,使他们更加的平均
LocalityBasedPicker:
选择本地行最强的Region

配置负载均衡:
hbase-site.xml>
hbase.balancer.period
300000

hbase(main):043:1>balance_switch true //开启
hbase(main):043:1> balancer   //负载均衡
hbase(main):044:1> balance_switch false //关闭

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

laufing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值