【HBase】原理和操作

一、整体架构

1.Client客户端:操作HBase的入口
2.Zookeeper:
(1)HMaster的主备选举
(2)心跳检测
(3)保存meta表,用于查询region
3.HMaster:
(1)主节点,负责管理HRegionServer的负载均衡和table的创建
(2)当region分裂时,负责将新region分配到具体的HRegionServer
(3)当HRegionServer宕机时,则负责其上的region转移
4.HRegionServer:
(1)从节点,负责数据的读写请求
(2)当region过大时进行切分
5.Region:HBase的最小存储单元
在这里插入图片描述

二、存储原理

1.store列族:可以理解为关系型数据库中的字段,如果一个表有N个store,则每个region有多个store

2.memstore:每个store都会有一个memstore(内存区域)用于写入数据的缓冲
3.StoreFile:当memstore达到阈值进行刷盘则会生成新的StoreFile,每个store可以有多个StoreFile
在这里插入图片描述

三、读取流程

1.client到zookeeper获取meta表

2.根据namesapce、表名、rowkey查询meta表,获取对应region
3.找到对应HRegionServer下的region
4.先从memstore中查找数据,如果没有,再到BlockCache中获取
5.如果BlockCache中也没有,再到StoreFile上进行读取
6.StoreFile中读取到数据后,先写BlockCache再返回给客户端
在这里插入图片描述

四、写入流程

1.client到zookeeper获取meta表

2.根据namesapce、表名、rowkey查询meta表,获取对应region
3.找到对应HRegionServer下的region

4.把数据写入HLog和memstore各一份
5.memstore到达阈值刷盘生成storeFile
6.删除HLog中的历史数据

五、flush触发机制

1.memstore大小达到阈值,默认为128M

2.所有memstore总和达到阈值,默认128*2=256M
3.HLog数量达到阈值
4.定期刷新memstore,默认周期为1小时
5.手动flush,flush ‘tablename’或者flush ‘region name’

六、compaction合并机制

1.minor compaction小合并:触发频率高,仅将小的临近的storeFile合并成一个大的storeFile,对更新、删除数据做标记

<!--默认值3;表示一个store中至少有4个store file时,会触发minor compaction-->
<property>
    <name>hbase.hstore.compactionThreshold</name>
    <value>3</value>
</property>
<!--默认值10;表示一次minor compaction中最多合并10个store file-->
<property>
    <name>hbase.hstore.compaction.max</name>
    <value>10</value>
</property>
<!--默认值为128m;表示store file文件大小小于该值时,一定会加入到minor compaction的-->
<property>
    <name>hbase.hstore.compaction.min.size</name>
    <value>134217728</value>
</property>
<!--默认值为LONG.MAX_VALUE;表示store file文件大小大于该值时,一定会被minor compaction排除-->
<property>
    <name>hbase.hstore.compaction.max.size</name>
    <value>9223372036854775807</value>
</property>

2.major compaction大合并:合并频率较低,默认7天一次,生产环境需要关闭该功能,手动触发major_compact tableName,将所有的StoreFile合并成一个StoreFile,清理删除的数据,过期的数据和版本号超过设定的数据

<!--默认值为7天进行一次大合并,-->
<property>
    <name>hbase.hregion.majorcompaction</name>
    <value>604800000</value>
</property>

七、预分区

1.预分区意义:增加数据读写效率、负载均衡,防止数据倾斜、方便集群容灾调度region、优化Map数量
2.预分区原理:每个region维护startRow和endRow,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。
3.手动指定预分区

1.直接创建时使用数组指定

create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']

2.把分区规则创建于文件中

cd /book/install
vim prepart.txt
create 'student','info',SPLITS_FILE => '/book/install/prepart.txt'

3.HexStringSplit算法

create 'mytable', 'base_info',' extra_info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值