Hbase介绍
读懂LSM的意义 这篇文章写得太好了
意义
HDFS虽然是分布式存储,但是做不到随机低延迟的读写。
Hive可以以SQL形式转换MR/Spark,减少开发难度,但是性能没有变化。
所以Hbase存在的意义就是解决随机低延迟读写的分布式存储问题,查询快。但不是最适合于做聚合计算,OLAP分析的场景
目标:低延迟的随机读写
低延迟,分布式,支持记录级别CRUD,保证数据一致性
思路
提高查询性能的实现
1 查询先查内存的读缓存,没有再查磁盘
2 内存数据设计良好高性能的数据结构 (ConcurrentSkillListMap)
3 磁盘数据 + 布隆索引
4 范围分区 + 排序
先排序,然后范围分区 + 分段扫描
注:排序好后位置已确定,磁盘中再插入不好解决。所以数据先放入内存中排序,插入时则内存中位置转换即可,最后溢写磁盘
5 跳表结构
元数据表记录各个数据分段存在哪些节点,大大提高性能。然后再创建root元数据表记录各个元数据表分段信息,形成跳表的思路
1.x 之前默认每个region最大128mb,空间很小所以加入三层,user table,meta table, root table
1.x 之后默认每个region最大10G,空间变大后改为两层,去掉了root table
另外客户端中还会缓存元数据
6 读缓存 + 写缓存
内存缓存会做常用的热缓存,提高缓存命中率。数据先写内存,内存不足时,则数据内存中排序后有序的写入磁盘,读写缓存分离
当读磁盘时,读取涉及多个磁盘文件,添加布隆过滤器来判定数据是否在这个磁盘文件中,不在则直接下一个磁盘文件不用扫描
当磁盘中分段数据太大,超过10G则split拆分为2,split是直接拆分,依然前后保持数据有序。
提高数据安全性实现
1 内存 + 磁盘
2 WAL机制
Hbase总结
以空间换时间,rowkey会重复存储,所以2.x版本后加入字典树来优化存储rowkey,降低冗余,提高查询效率
rowkey可以是任意字符串,最大64kb,实际应用一般10-100字节,最好16字节
多个列族时,则有多个Store
基本API使用
各个组件和模块功能
ZK职责
master不和rs集群通讯,rs集群和zk汇报信息,master只监听zk子节点的变化即可。
即如集群添加一个rs,子节点会增加一个,master则能够感知到
Hbase 元数据
1 表结构信息 2 表region分布信息
Master 职责
单主多从,单节点宕机,部分功能不可用。当Master不存在时,依然支持数据的读写。
但是 1 不能再建表,修改表结构 2 不能再处理如region的切分等造成的元数据变动
RegionServer 职责
注意点
读数据流程
1 确定元信息region在哪个节点。上图是1.x版本之前,1.x版本之后则没有root表,其他思路一致
(第二次查询时,client有保存缓存则直接走第4步)
写数据流程
第七步之后可能会触发写磁盘,HFile增加到三个可能触发合并文件Compact
StoreFile内部合并为minor compact,HRegion整个合并为major compact
WAL
简单来说就是直接顺序写磁盘性能很低,所以在内存中做排序,内存达到阈值时再写磁盘。
但是内存做大量处理不安全,所以加入HLog顺序写数据,用来防止异常修复数据。将随机磁盘写变成一次顺序磁盘写+内存写
HFile数据组织结构
1 File info 是整个数据段的描述信息,Data Index是Data段的索引,Meta Index是Meta段的索引
2 读取HFile首先读取Trailer,Trailer记录其他数据块(如File Info/Data Index)的偏移量,有指针指向其他数据块的起始点
3 Data段是记录图上图下展开的Key Value格式
具体Data段展开的Key-Value格式信息
Key Length/Value Length 分别用4字节记录key和value的实际占用大小
Hbase所有增删改都是append操作,通过KeyType来区分,KeyType记录put/delete两个值。
内存删除操作是及时的,这里的磁盘删除时KeyType delete记录,然后在HFile合并的时候真正物理删除
HLog日志
表设计
两种优化
rowkey设计
过滤器/布隆过滤器
用到了查就行
布隆过滤器:查询时,多个hash函数计算对应的位置结果都是1,则代表数据已存在
协处理器
不再需要全表扫描计算等,直接得到统计数据结果。谓词下推,提前计算
也可以通过协处理器实现二级索引/倒排索引,即通过value找key。插入key-value时,协处理器自动再插入value-key,但冗余很大
一般企业内Hbase + ES 构建倒排索引更普遍
总结