元数据的存储

元数据存储在某台region-server上,减少了对master的依赖,

flush的内部流程

数据put到所在列族的内存中,每次调用flush方法,内存空间就会生成对应的stroeFile文件对象,对应真实物理文件

hbase 插入和更新数据 hbase更新数据原理_缓存

读写数据流程和实现数据更新

写数据

  • 客户端执行put请求连接
  • Zookeeper会返回元数据位置信息
  • 然后客户端会去下载元数据信息,然后解析元数据信息,定位到是在哪个region-server的哪个region的列族上,写到内存上.
  • hbase 插入和更新数据 hbase更新数据原理_big data_02

  • 读数据
  • 客户端执行put请求连接
  • Zookeeper会返回元数据位置信息
  • 然后客户端会去下载元数据信息,然后解析元数据信息,定位到是在哪个region-server的哪个region的列族上
  • 从内存上读取文件,内存中有数据,先不返回,先放到缓存中,然后返回,下次,内存中数据没有了,直接从缓存中拿取.(flush和将数据放到缓存中都是一批一批的,datablock块).为了预防缓存上的文件与hdfs上的文件版本不一致,当从缓存中读取数据时,缓存会去加载hdfs上的文件个数,如果只有一个,代表缓存就是最新的,有两个,则拿取与自己不一样的,进行比较,将版本最新的返回

hbase 插入和更新数据 hbase更新数据原理_big data_03


实现数据更新


HDFS是以写入文件,合并文件,达到更新hbase的效果的 hfile文件合并是将指定的文件夹内部的文件合并和删除

flush刷写时机

  1. 单个的memoryStore大小达到阈值 128m
  2. 手动强制刷写flush
  3. 所有的memoryStore内存总和达到整个RegionServer的上限阈值,所有的region都要刷写
  4. 操作次数达到阈值

hile的合并API

compact 't1 ’ compact 压缩

布隆过滤器
作用:

从大量的文件中快速的定位数据所在文件 底层是字节数组,当存储或获取时,将rowkey计算hash值,存储,并将值标为1,
所以,存储或取值时,如果值为0,文件一定不存在,如果为1,会根据rowkey索引拿取文件. 但数据有可能会出现hash碰撞.文件不一定存在.

合并region:

merge_region ‘’ , ‘’ 合并region,不需要表名
合并region会占用大量io资源,不建议,提前将region设计好

region拆分

三种拆分方法

  1. split命令 手动拆分
  2. 预分region
  3. 自动拆分 随着数据的插入,region中的数据越来越多,自动的拆分

自动拆分策略 (一般使用预分region(根据业务)加自动拆分策略)

大小拆分 按照数据规则划分

rowkey设计

  1. 定长
  2. 唯一性
  3. 查询频次
  4. 不要太长 会冗余