(1). 为什么学习HBase(以及看源码)?
该方案在生产验证(3台4核8G):30亿文档,检索时间为:1.8/sec.我们知道,数据存储比较简单,而基于数据检索(Query)反而是比较复杂的,特别是Sass化的今天,数据量庞大,检索的条件比较复杂(模糊检索).
而在Query时,再使用RDBMS,会感觉到力不从心了(特别是模糊检索),那么,业界有没有一个好的解决方案呢?
在业界确实存在一套整合方案(HBase+Solr/ES),大体的解决方案如下:
- 订阅MySQL binlog.
- 解析binlog往Hbase里进行存储.
- HBase在保存时,会产生WAL(类似于MySQL binlog)日志.
- 订阅HBase WAL日志,存储到Elastic Search里.
- ES只存储与检索条件相关的数据,而不是所有的数据,尽量让ES(Term Index)热块在内存里(比如:富文本在ES中只做索引,而原文本内容存储在HBase里).
- 检索时,从ES检索出数据,返回的是:rowkey(HBase概念).
- 通过rowkey到HBase里批量检索出数据,再对数据进行拼装(这过程是不是感觉和MySQL的辅助索引很像).
- 方案是比较完美,但是,说实话,开发人员需要懂:ES和Hbase,所以,我的想法是自己写ES Plugin,实现第6步和第7步.
- ES的x-pack已经支持了SQL,为什么要还要自己写(ES Plugin)?因为x-pack是收费的,同时,我不仅要通过ES查询,还会要检索HBase,再进行组合(跨多个源).这个步骤,我也想通过SQL来做到,整个开发过程让开发是无感知的.
- 稍微提一下,SQL解析框架:Apache Calcite,后期,会对它进行源码分析和应用.
- HBase的缺陷是什么?HBase只能通过rowkey来检索(从性能上来说),所以,针对HBase的缺陷,有一些框架提供了二级索引的功能.
- 最终要实现如下图:
(2). HBase是怎么来的?
2006年Google技术人员Fay Chang发布了一篇文章Bigtable:A Distributed Storage System For Structured Data.
它向我们介绍了一种分布式的数据库,这种数据库可以在局部几台服务器崩溃的情况下,仍然可以继续提供服务.
(3). Hbase中的角色
ZK : 存储RegsionServer节点信息.
Master:负责维护表的结构信息.
RegsionServer:负责数据存储(内部维护N个Region容器).
Client:每次与HBase连接时,都是先和ZK通信,查询出:RegsionServer,然后,再连接:RegsionServer.
(4). Hbase数据模型 VS RDBMS
RDBMS存储模型
id | name | sex | pwd |
---|---|---|---|
1 | 张三 | 男 | 123 |
2 | 李四 | 男 | 321 |
HBASE存储模型
rowkey | cf:column-key | time | cell value |
---|---|---|---|
1 | info:name | 123 | 张三 |
1 | info:sex | 123 | 男 |
1 | info:pwd | 123 | 123 |
2 | info:name | 123 | 李四 |
2 | info:sex | 123 | 男 |
2 | info:pwd | 123 | 321 |
(5). Hbase术语介绍
术语 | 介绍 |
---|---|
cell | 数据 |
column family | 在Hbase里,列簇一般用于将相关的列(Cloumn)组合起来,在物理上Hbase其实是按照CF存储的,可以包含N个列 |
column | 列是数据存储的最小单元 |
row | 一个列或者多个列(列簇),形成一行 |
region | region类似于一个容器,由N个row组合而成 |
(6). HBase学习目录
“HBase 伪集群搭建(二)”
“HBase 基本操作(三)”
“HBase Java API基本操作(四)”
“HBase + Phoenix搭配(五)”
“HBase内部结构详解(六)”