目录
1. 定义
2.Hbase的发展历史
3.关系型数据库的不足
3.1无法适应多变的数据结构
3.2高并发读写的瓶颈
3.3可扩展性的限制
4.HBase的特点
5.使用场景
6.rowkey设计原则
6.1 rowkey长度原则
6.2 rowkey散列原则
6.3 rowkey的唯一原则
7.查询方式
8.Hbase的cell结构
9.Hbase的读写流程
9.1 HBase的读流程:
9.2 HBase的写流程:
10.Hbase的结构:
10.1 HMaster:
10.2 HRegionServer:
10.3 Zookeeper:
11.Hbase中的Compact机制
1. 定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
Hbase面向列存储,构建于Hadoop之上,提供对10亿级别表数据的快速随机实时读写!
2.Hbase的发展历史
2006年Google技术人员Fay Chang发布了一篇文章Bigtable: ADistributed Storage System for Structured Data。该文章向世人介绍了一种分布式的数据库,这种数据库可以在局部几台服务器崩溃的情况下继续提供高性能的服务。
2007年Powerset公司的工作人员基于此文研发了BigTable的Java开源版本,即HBase。刚开始它只是Hadoop的一部分。
2008年HBase成为了Apache的顶级项目。HBase几乎实现了BigTable的所有特性。它被称为一个开源的非关系型分布式数据库。
2010年HBase的开发速度打破了一直以来跟Hadoop版本一致的惯例,因为HBase的版本发布速度已经超越了Hadoop。它的版本号一下从0.20.x跳跃到了0.89.x。其Logo也进行了更换!
3.关系型数据库的不足
3.1无法适应多变的数据结构
现代网络中存在大量的半结构化、非结构化数据,针对结构化数据而设计的关系型数据库系统来说,对这些不断变化的数据结构,很难进行高效的处理。
3.2高并发读写的瓶颈
当数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得在并发处理时非常容易发生死锁,导致其读写速度下滑严重。
3.3可扩展性的限制
在现代互联网环境下,应用系统可能在短时间内出现业务量和业务类型的快速变化,而这些变化要求支撑数据库在底层硬件和数据库设计中提供极强的扩展性。由于关系型数据库存在类似的join操作,使得数据库在扩展方面很困难。
4.HBase的特点
(1)表大:一个表可以有数亿行,上百万列。
(2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列。
(3)面向列:HBase是面向列的的存储和权限控制,列族独立索引。
(4)稀疏:空(null)列并不占用空间,表可以设计的非常稀疏。
(5)数据类型单一:HBase中的数据都是字符串,没有类型。
(6)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳。
5.使用场景
(1)半结构化数据和非结构化数据,可以进行动态扩展。
(2)记录非常的稀疏。
(3)多版本数据。
(4)超大数据容量:HBase会自动水平切分扩展,跟Hadoop的无缝集成保证了其数据的可靠性和海量数据分析的高性能。
6.rowkey设计原则
6.1 rowkey长度原则
rowkey是一个二进制流,长度开发者建议是10-100字节,不过建议越短越好,最好不超过16字节。原因是:数据持久化文件HFile中是按照按照key/value存储的,如果rowkey太长的话就会影响HFile的存储效率。Memstore将缓存数据到内存,如果rowkey字段过长内存的有效利用会降低,系统将会无法缓存更多的数据,降低检索的效率。
6.2 rowkey散列原则
如果rowkey是按照时间戳方式递增的话,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,如果没有散列字段就会出现一个regionServer上堆积的热点现象。
6.3 rowkey的唯一原则
rowkey不能为空且唯一。
7.查询方式
全表查询:scan tableName
单行查询:get tableName,'1’
范围扫描:scan tableName, {STARTROW=>‘1’,STOPROW=>‘2’}
条件查询:
(1)scan可以通过setCaching和setBatch方法来提高速度;
(2)scan也可以通过setStartRow和setEndRow来限定范围;
(3)scan还可以通过setFileter方法来添加过滤器。
8.Hbase的cell结构
单元格( cell ):在table中,通过行、列族、列、时间戳来确定一个cell,cell中存储的数据没有数据类型,是字节数组byte[] ,通过<RowKey,Column Family: Column Qualifier,Timestamp>元组来访问单元格。
Hbase中表示行的集合,行是列族的集合,列族是列的集合,列是键值对的集合;
9.Hbase的读写流程
9.1 HBase的读流程:
(1)HRegisonServer保存着.meta.表及数据表,首先client先访问zk,访问-ROOT-表,然后在zk上面获取.meta.表所在的位置信息,找到这个meta表在哪个HRegionServer上面保存着。
(2)接着client访问HRegionServer表从而读取.meta.进而获取.meta.表中存放的元数据。
(3)client通过.meta.中的元数据信息,访问对应的HRegionServer,然后扫描HRegionServer的Memstore和StoreFile来查询数据。
(4)最后HRegionServer把数据反馈给client。
9.2 HBase的写流程:
(1)client访问zk中的-ROOT-表,然后后在访问.meta.表,并获取.meta.中的元数据。
(2)确定当前要写入的HRegion和HRegionServer。
(3)clinet向HRegionServer发出写相应的请求,HRegionServer收到请求并响应。
(4)client先将数据写入到HLog中,以防数据丢失。
(5)然后将数据写入到MemStore中。
(6)如果HLog和MemStore都写入成功了,那么表示这个条数据写入成功了。
(7)如果MemStore写入的数据达到了阈值,那么将会flush到StoreFile中。
(8)当StoreFile越来越多,会触发Compact合并操作,将过多的StoreFile合并成一个大的StoreFile。
(9)当StoreFile越来越多时,Region也会越来越大,当达到阈值时,会触发spilit操作,将这个Region一分为二。
注:HBase中所有的更新和删除操作都会在后续的compact中进行,使得用户的写操作只需要进入内存中就行了。实现了HBase的 I/O高性能。
10.Hbase的结构:
10.1 HMaster:
(1)、为所有的RegionServer分配Region。
(2)、负责RegionServer的负载均衡。
(3)、发现失效的RegionServer并重新分配其上的Region。
(4)、HDFS上的垃圾文件。
(5)、处理Schema更新请求(表的创建,删除,修改,列族的增加等)。
10.2 HRegionServer:
(1)HRegion:
Table在行的方向上分隔为多个Region,Region是HBase中分布式存储和负载均衡的最小单元,即不同的Region可以分在不同的RegionServer上面,但同一个Region是不会拆分到多个Server上面的。随着数据的增多,某个列族的达到一个阈值就会分成两个新的Region。结构:<表名,startRowkey,创建时间>,由目录表(-ROOT-,.META.)记录该Region的endRowkey
(2)Store:
每一个Region由一个或多个Store组成,至少是一个Store,HBase会把访问的数据存放在Store中,即每一个列族建一个Store,如果有多个ColumnFamily,就有多个Store,一个Store由一个MemStore和0或多个StoreFile组成。HBase通过Store的大小判断是否需要切分Region。
(3)MemStore:
它是放在内存中的,保存修改的数据,即key/values。当MemStore的大小达到一定的阈值的时候(默认128M),MemStore会被Flush到文件,即生成一个快照StoreFile,Flush过程由一个线程完成。
(4)StoreFile:
StoreFile底层是HFile,HFile是Hadoop的二进制格式文件,
(5)HLog:
WAL文件,用来灾难恢复使用,HLog记录数据的所有变更,一旦RegionServer宕机,就从HLog中进行恢复,HLog文件就是一个普通的Hadoop Sequence File,Sequence File记录了写入数据的归属信息,除了Table和Region名字外,还同时包括了Sequence Number和TimeStamp,Sequence File的value是HBase的key/value对象,即对应的HFile中的key/value。
10.3 Zookeeper:
(1)保证任何时候集群中只有一个活跃的Master。
(2)存储所有的Region的寻址入口,知道哪个Region在哪台机器上。
(3)实时监控RegionServer的状态,将RegionServer的上下线的信息汇报给HMaster,RegionServer不直接向HMaster汇报信息,减轻HMaster的压力,而是通过向ZK发送信息。
(4)存储HBase的元数据结构(schema),知道集群中有哪些Table,每个Table有哪些Column Family。
11.Hbase中的Compact机制
(1)当HBase中的memstore数据flush到磁盘的时候,就会形成一个storefile,当storefile的数量达到一定程度的时候,就需要将storefile文件进行compaction操作,Compact作用:合并文件、清理过期,多余版本数据、提高读写效率。
(2)compact操作的实现:
1)minor:Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。
2)major:Major 操作是对 Region 下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。