Hbase简介
HBase是一个分布式的、面向列的开源数据库存储系统 ,是对Google论文Bigtable的实现,具有高可靠性、高性能和可伸缩性,它可以处理分布在数千台通用服务器上的PB级的海量数据 。Bigtable是通过Google文件系统(GFS)来存储数据的,而HBase对应的是通过Hadoop分布式文件系统(HDFS)来存储数据的。Hbase是Apache的Hadoop项目的子项目,不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,另外HBase是基于行键、列键和时间戳建立索引的模式存储数据的。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase可以在一个服务器集群上运行,并且能够根据业务进行横向扩展。
Hbase与传统数据库的区别
项目 | Hbase | 传统数据库 |
---|---|---|
数据量 | 线性扩展,数据量增多时可通过节点扩展进行支撑 | 数据量很大的时候无法存储 |
数据备份 | 数据存储在hdfs上,备份机制健全 | 没有很好的备份机制 |
访问速度 | 通过zookeeper协调查找数据,访问速度快 | 数据达到一定数量会开始变慢,很大的时候甚至无法支撑 |
数据表结构 | 列动态增加,数据自动切分,支持高并发读写,但不支持条件查询 | 列动态增加,数据自动切分,支持高并发读写,支持复杂的查询 |
Hbase的特点
面向列: Hbase是面向列的存储和权限控制,并支持独立索引。列式存储,其数据在表中是按照某列存储的,这样在查询时只需要少数几个字段,可以大大减少读取的数据量。
多版本: Hbase每一个列会存储多个Version。
稀疏性: 为空的列不占用存储空间,表可以设计的非常稀疏。
可扩展性: 因为底层依赖的是HDFS,HDFS本身就可以进行扩展。
高可靠性: WAL机制保证了数据写入时不会因为集群异常而导致写入数据丢失,Replication机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且Hbase底层使用HDFS,HDFS本身就会进行备份。
高性能: 底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase具有非常高的写入性能。region切分主键索引和缓存机制使得Hbase在海量数据下具备一定的随机读取性能,该性能针对RowKey的查询能达到毫秒级别。
HBase依赖于Zookeeper: Hbase是依赖于Zookeeper的,HBase中有内置的Zookeeper,但一般我们会用其他的 Zookeeper 集群来监管 HMaster 和HRegionServer,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster 。
Hbase的架构图
Hbase的架构图如下:
1、HBase架构中有若干个从节点HRegionServer,负责维护主节点HMaster分配给它的HRegion,响应客户端Client的I/O请求,向HDFS文件系统中读写数据,切分在运行过程中变得过大的HRegion。并发性能与HRegionServer的个数有关。
2、一个HRegionServer中有若干个HRegion,若干连续的行构成一个HRegion,当一个HRegion所有的storefile的大小超过阈值后,这个HRegion会分割为两个,并由HMaster分配到相应的HRegionServer服务器,实现负载均衡,所以一张完整的表可能被保存在多个HRegionServer上,HRegion是HBase中分布式存储和负载均衡的最小单元,但并不是存储的最小单元。
3、HBase中的每张表都通过RowKey按照一定的范围被分割成多个子表(HRegion),默认一个HRegion超过256M就要被分割成两个,这个过程由HRegionServer管理,而HRegion的分配由HMaster管理。 一个HRegion中有若干个Store,每个Store是一个列族,Store分两种,新插入的数据在内存数据MemStore中,满了之后写到磁盘StoreFile中,数据以HFile的格式保存在hdfs的DataNode中,StoreFile中有Hfile的元数据,方便索引。客户端在检索数据时,先在MemStore找,找不到再找StoreFile。不断的写StoreFile生成HFile会产生很多小文件不利于性能,所以会合并小StoreFile形成更大的,过大的话再切分。
4、HLog是一种预写日志WAL log,即Write ahead log,对hbase操作之前会将指令先写入HLog,如MemStore中的数据还没写入StoreFile时停电了,就可以进行数据恢复。每个HRegionServer只有一个HLog,缺点是如果一台HRegionServer下线,为了恢复其上的HRegion,需要将HLog进行拆分,然后分发到其它HRegionServer上进行恢复。
5、HMaster管理用户的增删改查操作,管理HRegionServer的负载均衡,调整Region分布,在HRegionServer停机后,负责失效HRegionServer上的HRegion迁移。由于master只维护表和HRegion的元数据,而不参与表数据I/O的过程,HMaster下线仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的schema,无法进行HRegion的负载均衡,无法处理HRegion上下线,无法进行HRegion的合并,唯一例外的是HRegion的 split可以正常进行,因为只有HRegionServer参与),表的数据读写还可以正常进行。因此HMaster下线短时间内对整个HBase集群没有影响。从上线过程可以看到,HMaster保存的 信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来),因此,一般HBase集群中总是有一个HMaster在提供服务,还有一个以上的"HMaster"在等待时机抢占它的位置。
6、客户端client包含有各种接口,client维护着一些cache来加快对HBase的访问,比如HRegion的位置信息。读写操作时,客户端直接与HRegionServer通信,建表等管理操作则请求ZooKeeper与HMaster通信。
7、ZooKeeper是分布式应用程序协调服务,保存了表元数据寻址地址(-ROOT-表的地址)、HMaster和HRegionServer的状态信息。它的作用是保证集群中只有一个HMaster,实时监控HRegionServer的状态并通知给HMaster。
8、-ROOT-表和.META.表是两个内置表。.META.表中每一行记录了一个用户表HRegion的信息,当用户表特别大时,HRegion也会非常多,.META.表也变得非常大,这时.META.自己也需要划分成多个HRegion,托管到多个HRegionServer上,此时需要用-ROOT-表去定位.META.,即-ROOT-表保存.META.表的HRegion信息。-ROOT-表永远只有一个HRegion,也就只会存放在一台HRegionServer上,定位任意HRegion需要3次跳转。示意图如下:
9、HFile是HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件。 首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。 Data Block是hbase io的基本单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB),大号的Block有利于顺序Scan,小号的Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏。
Hbase数据模型
HBase是一个面向列的存储数据库,与一般的关系型数据库不同,它里面的数据是以列的形式来进行存储的。在Hbase中一张表的列簇不会超过5个,每个列簇中的列数没有限制,HBase表的数据模型如下图:
1、hbase表由若干行组成,行之间是有序的,按照唯一行键RowKey排序。
2、每一行由多个列族ColumnFamily组成,列族需要在创建表的时候定义好,如在语句create 'test','col1','col2'中,test为表名,col1为列族名。HBase的权限控制、存储以及调优都是在列族层面进行的,同一列族的数据存储在同一目录下,建议列族数目不多于3个。
3、列族由多个列column组成,列不用预先定义,可以随时修改。
4、每一个单元格cell都有唯一的时间戳timestamp标记版本。因为Hbase不适合修改数据,所以用时间戳记录版本,修改数据就是添加新数据。单元格内的数据都是以字节数组表示的键值对。
HBase读数据流程
Hbase的读数据流程如下:
1、Client访问Zookeeper,获取-ROOT-表的元数据信息,即表位于哪个RegionServer。
2、Zookeeper收到Client请求,并向客户端返回此RegionServer的地址。
3、Client通过获取到的RegionServer的IP去访问RegionServer。
4、Client接着读取RegionServer中的-ROOT-表的内容,获取到.META表的地址。
5、Client根据.META表的地址,访问.META表,获取到数据的元数据信息。
6、client根据获取到的数据的元数据信息,去访问对应的HRegionServer,然后扫描所在的MemeStore和storefile来查询数据。
HBase写数据流程
Hbase的写数据流程如下:
1、Client向Zookeeper发送写数据请求。
2、Zookeeper收到Client发送的写数据请求,然后返回要写入数据对应的HRegionServer服务器和HRegion信息。
3、Client根据Zookeeper发送过来的信息向对应的HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。
4、Client先把数据写入到HLog中,防止数据丢失,然后再写入数据。
5、如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore达到16kb,会把 Memstore 中的数据写到一个队列中。
6、每次写满一个MemStore就会生一个HFile。
7、当HFile达到一定数量时,HRegionServer调用HDFS的API对HFile进行合并。