对HBase整个框架的理解

来源:互联网 发布:asp.net mysql 编辑:程序博客网 时间:2024/05/17 01:07

        HBase是一个分布式的、可扩展的、高容错性的,可以用于存储海量数据的数据库,对于存储半结构化、非结构化数据优势明显。

相比于传统的数据库,HBase有以下几点优势:

1.传统的数据库比如mysql,是以行存储的,数据一行一行的存储,如果要读出数据中的某一列,就必须读出一整行的数据,如果每一行的数据非常的大那么则会读出很多不必要的数据。HBase是基于列存储的数据库,每一列的数据是存储在一起的,HBase的列族数量是固定的,但是HBase的列的数量是可以随意增长的,这就意味着如果在存储某行数据的时候需要添加一个新的列,直接指定某列加入到某个列族,然后存入数据就行了,这是因为在HBase里面查找一条指定的数据是通过键值对应来查找的,键为<rowkey,column family,column ,timestamp>,值为数据.

        

2.传统的数据库中,如果某一行的值没有指定一般会指定默认值或者设置为空值,这样会造成存储空间的浪费,而在HBase中,没有值的列就不存储任何值,节省了很多空间。

3.HBase是可以动态扩展的,如果存储空间不够了,只需要在集群里面添加新的服务器即可,而传统的数据库还需要做很多的额外工作。HBase在某个表行的数量过多的时候会自动拆分成多个Region,而在传统数据库中这些操作只能认为的指定。

         4.HBase更新值并不会立即删除之前的值,所以可以保存多个版本的历史值。

但是HBase也有一些缺点:

1.       HBase 写入的时候使用会先将数据写入缓存当中,这样做的效果就是写入一条数据非常的快,但是造成的损失就是读性能降低,因为读数据的时候会在内存和文件系统中同时查找要查询的数据是否存在,然后对查询的结果进行合并,最后的结果将返回给用户。当然HBase提供了一个小的解决方案就是,在RegionServer上设置block cache来缓存用户读取的数据,block cache缓存使用的换入换出算法是LRU,这样能够保证经常读取的数据能保存在内存中比较久。

2.       HBase需要使用很大的内存,所以对gc来说很麻烦。

 

HBase的架构如下:


Zookeeper 的主要作用是:

1.       进行选举保证集群中只有一个Mater。

2.       将Region Server的上下线信息通知Master

3.       存储-ROOT-表的寻址入口

4.       存储HBase的schema,包括有哪些表和每个表有哪些列族

Master的主要作用是:

1.       负责给Regoin Server分配Region

2.       负责Region Server的负载均衡

3.       Region Server故障之后对Region Server的Region分配到其它Region Server

4.       HDFS上的垃圾回收

5.       处理schema更新请求

Region Server的主要作用:

1.       负责Region相关的IO操作

2.       对过大的Region进行split

 

HFile的compaction过程

 

Region的split过程

 

HBase的一次查询操作:

        首先客户端会给出相应的<rowkey,columnfamily ,column>,请求发送到HBas集群之后,会在zookeeper里面查询-ROOT-表的位置,然后去某个Region Server找到-ROOT-表,-ROOT-表的rowkey为<.META.,<用户表名,Region的起始rowkey,ts>,ts>,根据客户端请求的rowkey,通过比较-ROOT-表中最大的那个小于等于<用户表名,rowkey>的rowkey,那么这就是我们要找的那个Region,同理在.META.表里面也是这样的一个过程。经过三次寻址之后就能找到数据,然后把经过归并排序之后的结果返回给客户端。查询之后的数据会放在block cache之中方便下次读取加快速度。

 

HBase的一次写入操作:

         客户端一般会将数据先缓存在客户端的Write Buffer中(一般Write Buffer大小为2M左右),这样写入的数据会达到一定大小再与服务器通信,减少了通信造成的开销,Write Buffer有三种情况会提交给Region Server

(1)    Write Buffer 满

(2)    手动调用HTable.flushCommits()方法

(3)    客户端关闭

        客户端的数据发送到服务器之后,首先根据表名和rowkey进行寻址,查找到可以写入的那个RegionServer,首先把数据变动写入到HLog之中,这样可以防止服务器异常终止之后memstore中的数据丢失造成不良后果。然后将数据写入到指定的Region的memstore,因为是直接写入内存而不是写入文件,所以速度非常的快。于是数据存储在memstore之中,memstore如果达到了一定的大小(hbase.hRegion.memstore.flush.size),memstore的内容就会刷新写入(flush)到Hfile中去,这时候会创建一个新的memstore来接收客户端的读请求,然后原先的memstore将内容flush到HFile中去,之后将旧memstore释放。

        这就是我对HBase的初步认识,下一步计划是HBase中实际的存储读取数据,阅读源代码,深入对HBase的理解。


0 0