新人对于HBase的一点理解,可能乱七八糟,若是有什么理解不恰当的地方,你咬我啊~git
- - 若有问题,我们能够一块儿讨论下。。。github
HBase是Apache hadoop集群中经常使用的非关系型数据,它是一种开源的、分布式的、多版本、面向列存储的数据库。数据库
它的源码在 https://github.com/apache/hbase 上,妥妥的开源啊。。。apache
分布式是由于它的数据最后存储在HDFS上,因此它继承了hadoop分布式的优良传统(不知道可否这么理解)。api
多版本就很少介绍了,版本更新快呗。。。缓存
面向列的存储是它与传统关系型数据库最大的区别之一,它是根据rowKey、columnfamily、quaifer、timestamp(若是你有多版本的话)获得你最后的value值。。这个我们之后再介绍,今天主要想写的是hbase的体系结构。服务器
hbase的服务器体系结构也是主从服务器架构,分为HBase Master server和HRegionServers。架构
HBase Master server :主服务器,主要负责管理HRegionServers,我的理解:只是关于HRegionServer的决策权都是由它完成的。负载均衡
具体的功能有:分布式
1.用户对Table的增、删、改、查。
2。HRegionServer的负载均衡,调整HRegion的分布,像一个HRegionserver挂了,master会将挂了的HRegionserver上面的HRegion从新拿到,标上未分配,而后再分配一个活的HRegionServer,固然,它也得先询问下这个HRegionServer要不要了。。
3.在HRegion分裂后,负责新的HRegion的分配。 默认的HRegion的大小为64M,当超过这个大小的时候,它会自动分裂成两个,而且这个拆分速度很快,由于它在拆分的时候先会建立两个HRegion,而这两个HRegion先会保存对原HRegion的引用,当这两个新的HRegion数据拆分完成后,再将此引用去掉,并删除原HRegion。如今拆分完了,可是HRegion不是拆分完了就没事干了,它得找个HRegionServer管理啊,so,又得HBase Master Server分配了,同上~~
4.HRegionServer停机后,负责失效的HRegionServer上的HRegion分配。服务挂了,可是HRegion没挂啊,HRegion能够说是一个存储文件夹,一个服务挂了,找头(hbase master server)再找一个呗,而后继续作着保存或查询时被提取数据的工做。
HRegionServer的构成:
HRegionServer包含了一个HLog部分和HRegion部分(多个HRegion)。。
ps:这地方可能有些异议,由于网上一些图片显示的都是HRegion里才包含HLog,网上的资料比较老,因此这里我参考《hadoop实战》中的资料,它的版本是0.92,可能与如今的0.96版本还算比较接近的。。
HLog部分保存着用户操做hbase的日志(不排除也包含master管理hregion的操做,明天看一下),用户的操做都会先记录到HLog中,而后再保存到HRegion中。
而HRegion其实就是存储的实际数据了。它包含了多个HStore。
HStore:每个列族都会造成一个HStore,它又由MemStore和多个HFile组成。
MemStore驻留在内存中,当数据保存时,数据会先存储到MemStore中,而后根据用户设定的显式刷写或隐式刷写模式,将数据再保存到HFile中。默认的存储模式是隐式存储。这个之后写client api的时候再介绍。。固然,这地方还有个注意的地方,当数据保存到MemStore,最后却没有保存到HFile中时,死机了。。HLog的做用来了,用户操做的指令保存在HLog中,它会将指令执行,再将从新保存到MemStore中,这样就能够完成后面的操做了。。
HFile负责的是实际数据的存储了,它是HBase中的最小单位了。它也能够进行拆分,也就是所谓的分区,让数据更加分散,读取数据的时候更加效率。
昨天未写完的部分今天补上。。
HBase的两个主要结构介绍完了,那么我们如今就开始介绍一下它的存储流程和读取的流程。。
将它做为一个流程图可能不太合适。。不过它里面所须要的东西基本都包含了。。
先说下Zookeeper的做用:
存储了Root表的地址和HMaster的地址。存储ROOT的地址能够更快的查询到哪张表有数据,提升运算效率。存储HMaster地址是为了肯定有哪些HMaster。
管理着MHaster。当HMaster失效时,它能够找到另外一个HMaster,避免HMaster单点故障。
ROOT与.META与Region的结构是同样的,都是以键值对的形式保存数据。。
ROOT里面存储了对应的.META地址和开始结束信息(像1-5,说明ROOT里面存储了5个.META的地址信息)。
.META里面一样存储了对应的HRegion地址和开始结束信息。
好了,如今开始经过从客户端读取信息的角度开始分析了:
client要读取信息,先查询下client 端的cache中是否存在数据,若是存在,刚直接返回数据。若是不存在,则进入到zookeeper,查找到里面的相应数据存在的Root表中的地址。
经过数据存在ROOT表中地址找到.META,最终找到HRegion。找到HRegion后,它会先访问MemStore中是否存在数据,若是存在,则直接读取。若是没有,就再到HFile中查找数据,并将数据放到MemStore。
最后数据返回到客户端显示。。
存储数据流程:
因为Hbase中默认的刷写方式是隐式刷写,因此你在put()数据时,它会自动保存到HRegion上,但当你批量处理数据时,它会将数据先保存到client端的cache中。当你关闭隐式刷写时,你put()的数据则会保存到client cache中,直到你调用刷写命令时,才会保存到HRegion中。具体的命令等明天我去公司的时候贴上来。。在家没环境。。
在HRegion部分的存储:要写入的数据会先写到HMemcache 和Hlog 中,HMemcache 创建缓存,Hlog 同步Hmemcache和Hstore 的事务日志,发起Flush Cache 时,数据持久化到Hstore 中,并清空HMemecache。
此处须要关注:
HBase 写数据,首先写入Memcache,并计入Log中,最后写入HStore中,若是在写入HStore是发生系统异常,就能够从Log中恢复数据,从新写 入HStore中。