目录(Hbase)
本质(是什么)(我在试着讲明白)
分布式的、面向列的开源数据库
作用(干什么)(我在试着讲明白)
用来非结构化数据存储
架构(有什么)(我在试着讲明白)
1、架构模型
HBASE的角色:client、master、zookeeper、regionserver、hlog五个角色组成
regionserver中有region、store
store中有memstore、storefile
client
操作hbase的接口,并维护客户端缓存
master
- 分配region
- 保证整个集群的所用regionserver负载均衡
- 当发现某台regionserver宕机之后,重新分配region
- 当region变大进行裂变的时候,master去分配region到哪一台regionserver
zookeeper
- 保证任何时刻中集群中有且仅有一台avtive的master
- 存储所有的region的寻址入口(所有的region元数据存储在哪一台regionserver上)
- 监控regionserver的上线和下线信息,并实时通知master
- 存储相关的表的schema数据
regionserver
- 负责接收客户端的读写请求,处理对于region的io
- 当某一个region变大之后,负责等分为两个region
regionserver中有其他节点(region、store)
region
- 相当于表的概念,一张表至少对应一个region
- 当表的数据过大的时候,region会裂变
store
- 相当于列族,存储结构使用了LSM的数据模型
store中有memstore、和storefile
memstore
- 位于内存
- 每一个store有一个memstore
storefile
- 磁盘存储空间,将数据持久化的存储位置
- 每一个region有一个或者多个storefile
- storefile可以进行合并操作
hlog
2、数据存储模型
角色:rowkey,column family, qulifier , timestamp,cell
rowkey
- 相当于Mysql的主键,唯一标识一行记录
- rowkey是字典序
- rowkey的长度最长是64k,但一般推荐10-100字节
column family
- 一组列的集合
- 列族必须作为表的schema定义给出
- 列族是权限,存储的最小单位
qulifier
- 列
- 可以动态的,随机插入
- 表定义之后没有限制列,随着值的插入也把列插入
- 列必须归属于某一个列族
timestamp
- 时间戳,64位整数,精度是毫秒
- 起版本号的作用,一个cell中可以存在多版本的数据
- 时间戳可以自己定义,但是一般不推荐
cell
- 存储数据的最小单位(逻辑概念)
- 存储的kv格式的数据(K:rowkey+column family+qulifier+timestarmp;V:value)
- hbase的cell存储数据的时候没有类型的区分,存放的都是字节数组
优缺点*(我在试着讲明白)*
优点
- 半结构化或非结构化数据
- 多版本号数据
- 仅要求最终一致性
- 高可用和海量数据以及很大的瞬间写入量
缺点
- 单一RowKey固有的局限性决定了它不可能有效地支持多条件查询
- 不适合于大范围扫描查询
- 不直接支持 SQL 的语句查询
流程(怎么运作)(我在试着讲明白)
HBASE的读写流程
读流程
- 客户端向zk中发送请求
- 从zk中拿到metadata的存储节点
- 去存储metadata的节点获取对应的region的位置
- 访问对应的region获取数据
- 先去metastore中查询数据,有结果就返回
- 没结果的话,去blockcache查找数据,有结果就返回
- 还是没有,就去storefile中查数据,并将查询的结果缓存到blockcache中,方便下次查询
- 将结果返回客户端
写流程
- client向zk发送请求
- 从zk中拿到metadata的存储节点
- 去存储metadata的节点获取对应的region的位置
- 访问对应的region写数据
- 首先向wal中写数据,写成功之后才会存储到memstore
- 当memstore中的数据量达到阈值之后,进行溢写,溢写成storefile
- store file 是一个个的小文件,会进行合并(minor,major)
- store file 是对hfile的封装,hfile是实际存储在hdfs上的数据文件
常用(必会)(我在试着讲明白)
1、常用的JavaApi
- HbaseAdmin 管理表(createtable、disabletable、deletetable)
- Htable 管理数据(put、get、scan、delete)
- FilerList(SingleColumnValueFiler、比较过滤器、专用过滤器、附件过滤器)
2、hbase cli 命令有哪些?
status,whoami,version,create,drop,disable,enable,put,get,delete,scan,list,flush,split
常见问题(必知)(我在试着讲明白)
1、HBASE的应用场景?
- 非结构化或者半结构化的松散数据
- 高并发客户端请求的数据
- 要求实时性比较高的数据
2、HBASE速度快的原因?
- 充分利用内存
- 使用了LSM树
- 缓存机制
- 文件是顺序读
3、HBASE的特点?
- 高可靠性
- 高性能
- 面向列
- 可伸缩
- 实时读写
4、hbase优化从哪些方面考虑?
优化方向:表设计,写表操作,读表操作,索引,htable和htablePool
表设计
- 预分区
- rowkey的设计原则(越短越好、hash、取反)
- 不要设置过多的列族(1-2个)
- SetMaxVersion
- SetTTL
- inMemory
- 合并和切分
合并: minor:小范围合并(3-10个文件)自动合并
切分: 将一个region等分为两个region,分布在不同的regionserver上
写表操作
- 多客户端并发写,创建多个htable对象
- 属性设置(关闭autoFlush、设置客户端写缓存、WAL Flag·不推荐关闭·)
- 多线程写
读表操作
- 多客户端并发写,创建多个htable对象
- 属性设置(scan 设置抓取数据的条数;关闭resultScanner;指定查询的column和family,不要一整行的所有数据读进来)
- 多线程读
- blockCache
一个regionserver共享一个blockCache
blockCache默认占用0.2的内存空间,对于注重读响应的系统,可以适当调大值
blockCache默认采用LRU的淘汰机制,默认淘汰最老的一批数据
索引
和ES做整合,步骤:
- 通过程序将Hbase中的数据读取存入ES中
- ES会创建索引,返回值是rowkey
- 当客户端请求进来之后,先去ES中查询获取rowkey的列表
- 再根据rowkey去hbase获取对应的数据
Htable和HtablePool
异议
有差错或者需要补充的地方,还望大家评论指出,并详细论证,相互学习,共同进步哈!