元数据的存储
元数据存储在某台region-server上,减少了对master的依赖,
flush的内部流程
数据put到所在列族的内存中,每次调用flush方法,内存空间就会生成对应的stroeFile文件对象,对应真实物理文件
读写数据流程和实现数据更新
写数据
- 客户端执行put请求连接
- Zookeeper会返回元数据位置信息
- 然后客户端会去下载元数据信息,然后解析元数据信息,定位到是在哪个region-server的哪个region的列族上,写到内存上.
- 读数据
- 客户端执行put请求连接
- Zookeeper会返回元数据位置信息
- 然后客户端会去下载元数据信息,然后解析元数据信息,定位到是在哪个region-server的哪个region的列族上
- 从内存上读取文件,内存中有数据,先不返回,先放到缓存中,然后返回,下次,内存中数据没有了,直接从缓存中拿取.(flush和将数据放到缓存中都是一批一批的,datablock块).为了预防缓存上的文件与hdfs上的文件版本不一致,当从缓存中读取数据时,缓存会去加载hdfs上的文件个数,如果只有一个,代表缓存就是最新的,有两个,则拿取与自己不一样的,进行比较,将版本最新的返回
实现数据更新
HDFS是以写入文件,合并文件,达到更新hbase的效果的 hfile文件合并是将指定的文件夹内部的文件合并和删除
flush刷写时机
- 单个的memoryStore大小达到阈值 128m
- 手动强制刷写flush
- 所有的memoryStore内存总和达到整个RegionServer的上限阈值,所有的region都要刷写
- 操作次数达到阈值
hile的合并API
compact 't1 ’ compact 压缩
布隆过滤器
作用:
从大量的文件中快速的定位数据所在文件 底层是字节数组,当存储或获取时,将rowkey计算hash值,存储,并将值标为1,
所以,存储或取值时,如果值为0,文件一定不存在,如果为1,会根据rowkey索引拿取文件. 但数据有可能会出现hash碰撞.文件不一定存在.
合并region:
merge_region ‘’ , ‘’ 合并region,不需要表名
合并region会占用大量io资源,不建议,提前将region设计好
region拆分
三种拆分方法
- split命令 手动拆分
- 预分region
- 自动拆分 随着数据的插入,region中的数据越来越多,自动的拆分
自动拆分策略 (一般使用预分region(根据业务)加自动拆分策略)
大小拆分 按照数据规则划分
rowkey设计
- 定长
- 唯一性
- 查询频次
- 不要太长 会冗余