Hbase原理增强

Hbase写数据流程
  1. 客户端向zookeeper发起请求要访问元数据信息
  2. zookeeper向客户端返回元数据表的位置
  3. 客户端向regionserver请求下载元数据表
  4. 下载缓存(META)–>解析:rowkey所在位置,hosts,regionname
  5. 请求指定的regionserver写数据
  6. 先将数据写到内存中去,并记录日志文件 数据被到->region中store(cf1)【列族】的’memorystore’【缓存】中,当memorystore内存达到一定大小后开始flush【刷写】到storefile
    中,然后被存储到hdfs中的一个指定目录下的hfile中 一个storefile对应一个hfile

在这里插入图片描述

为保证数据安全(避免写收到内存中后还没有来得及刷写机器宕机) 写到内存中的同时还会往日志文件中写数据到hdfs中

数据刷写flush的时机

  1. 单个的MomoryStore达到128M后会单个刷写
  2. 手动强制刷写
  3. 整个机器的内存达到阈值,会全部刷写MemoryStore释放内存空间
  4. 写数据的次数达到阈值

读数据流程

  1. 客户端向zookeeper发起请求,zookeeper返回元数据表所在的位置信息
  2. 客户端向regionserver请求下载元数据表
  3. 下载元数据信息缓存到本地
  4. 解析元数据信息 请求对应的RegionServer中的Region
  5. 先从内存对象MenoryStore中获取数据,如果没有再向缓存区域blockCache获取数据,缓存中再没有再去Hfile中获取数据,为了快速找到数据在哪个Hfile中,Hbase引用了布隆过滤器(算法)

region>>store>>MenoryStore>>blockCache>>HDFS:Hfile

  1. 从Hfile读取到数据后会将数据缓存到缓存区中方便下次再查找

布隆过滤器(算法)

每次flush都会在表对应的文件夹中生成Hfile文件 , 可能一个表中的Hfile文件会很多 ,为了快速的确定数据在哪个Hfile中, HBASE引入了布隆过滤器!

布隆过滤器在Hbase中的使用:

在Hfile文件下创建一块很小的内存空间存放一个字节数组,当我们根据"rowkey"查询数据的时候,会根据“rk”计算一个索引值,然后去字节数组中匹配,如果找到标记就是极有可能存在【误判:哈希碰撞】【插入数据的时候将key对应位置的值打一个标记】
如果找不到数据 就肯定不存在这个Hfile文件中

并发热点问题及解决方法

并发插入问题 如果只有一台机器同时插入大量数据可能会造成该机器内存溢出或者资源不够 导致宕机
解决方法:建立预分region表 把表拆分成多个region后在插入数据的时候插入请求就会被不同的机器接收从而解决了并发插入的热点问题

拆分

为什么要拆分region

当一个region管理的数据太多时可能会发生查询热点问题,导致一个region机器的负载过大!

region怎么拆分

1. 默认按照大小拆分

当hbase表在regionserver上的region,如果region的大小到达一个阈值,这个region将会分为两个。
计算方式如下
1^3 * 2 * 128M 256M
2^3 * 2 * 128M 2G
3^3 * 2 * 128M 6.75G
10G 10G

2. 手动拆分

split ‘tableName’, ‘splitKey’

在这里插入图片描述
负载均衡和移动region

移动切分后的region到其他机器上
move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’

在这里插入图片描述

3. keyPrefixRegionSplitPolicy(自定义) key的前缀

这种拆分是在原来的拆分基础上
,增加了拆分点(splitPoint,拆分点就是Region被拆分时候的rowkey)的定义,保证有相同前缀的rowkey不会被拆分到不同的Region上

4. DelimitedKeyPrefixRegionSplitPolicy key的分隔符

和上一种查分策略一致 , 上一种是按照key的固定长度拆分的 , 这种按照的是分割符

5. 建表时指定预分region

shell客户端
hbase> create ‘ns1:t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
java客户端
byte[][] keys = new byte[][]{“e”.getBytes(), “m”.getBytes(), “t”.getBytes()};
// 建表 指定预分region的key(数组)
admin.createTable(tableDescriptor, keys);

合并region(大合并和小合并)

Region合并

为什么要合并region

当表中的大量数据被删除之后,表中的行数急剧减少,但是region的数量没有变化,每个region管理的行数少!!!

shell命令合并region:

hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'

在这里插入图片描述

Hfile文件合并

1:数据加载到memstore,数据越来越多直到memstore占满,再写入硬盘storefile中,每次写入形成一个单独Hfile,当Hfile达到一定的数量后,就会开始把小Hfile合并成大Hfile
2;hfile文件的合并根本的来源就是来自数据的flush操作 每一次flush后会形成一个带有墓碑标记的新的hfile文件,每一次flush后系统会对当前Store中的文件数进行判断,一旦文件数大于配置文件个数,就会触发compaction合并

shell命令合并hfile文件

 major_compact 't1'

region寻址

客户端向zookeeper发出请求zookeeper向客户端返回元数据信息 元数据信息中就有region的位置

ROWKEY

用来表示唯一一行记录的主键,HBase的数据是按照RowKey的字典顺序进行全局排序的,所有的查询都只能依赖于这一个排序维度。

为什么要有rowkey设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。

rowkey设计原则

准备工作
1:观察数据结构 数据特点 了解核心字段
2:了解业务需求 数据的作用 是经常查询 还是 经常插入
3:经常查询 -->确定查询维度
设计原则
1:将查询维度频次最高的数据放在rowkey的位置上
2:保证rowkey的唯一性
3:rowkey的长度相同 方便排序
4:划分属性含义 使用特殊符号_
5:rowkey的设计不要太长
6:要考虑并发热点问题

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值