目录
百科
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
总结起来就是:
1.hbase是bigtable的开源版本;
2.是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统;
3.它不同于关系数据库,它仅能通过主键(row key)和主键的range来检索数据;
4.仅支持单行事务;
5.主要用来存储非结构化和半结构化的松散数据。
Hbase目标在于依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
Hbase 的基本概念
Row Key(主键)
表中行记录的主键;
相当于我们常见的关系型数据库中的主键,它是唯一的;在 HBase 中这个主键可以是任意的字符串,其最大长度是64K,在内部存储中会被存储为字节数组,HBase 表中的数据是按照 RowKey 的字典序排列的。
Column Family(列族)
列族,表schema一部分,列的前缀;
由若干列构成,是表schema 的一部分,需要在创建表的时候指定好(修改列族,成本比较大,因此不建议更改)。可允许定义的列族个数最多为20多个,列族可以帮我们构建数据的语义边界,还能有助于我们设置某些特性,比如可以指定某个列族内数据的压缩形式。一个列族包含的所有列在物理存储上都是在同一个底层的存储文件当中。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
Column(列)
列,属于某个列族,可动态添加;
列的数量一般的没有强限制的,一个列族当中可以有数百万个列;
列名都以列族作为前缀。例如 courses:history,courses:math 都属于courses 这个列族。
Version Number(版本)
版本,默认是时间,降序排列;
每一列的值或是每个单元格的值都是具有版本号的,默认使用的系统当前的时间戳,精确到毫秒。
Cell(单元格)
单元格,由 row key , column , version 唯一确定,字节码;
一个单元格就是由前面说的行键、列标示、版本号唯一来确定的;其中,列标示包括列族和列名。Cell 中的数据是没有类型的,全部都是字节码;
形式如: {row key, column(=<family> + <label>), version} 唯一确定的单元。
Region(区)
1.表在行的方向上分割为多个region;
2.region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region。当table中的行不断增多,就会有越来越多的region;
3.region是Hbase扩展和负载均衡的基本单元,不同的region分布到不同的regionServer;
4.region是分布式存储的最小单元,但不是存储的最小单元;
Hbase Table 中行的三种方式
1.通过单个 row key 访问;
2.通过 row key 的 range ;
3.全表扫描。
时间戳
HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
Hbase 的数据模型
HBase以表的形式存储数据,表由行和列族组成,列划分为若干个列族(row family),其逻辑视图如下:
Hbase 的特点
强一致性
同一行数据的读写只在同一台region server上进行;
水平伸缩
region的自动分裂以及master的balance;
只用增加data node机器即可增加容量;
只用增加region server机器即可增加读写吞吐量;
行事务
同一行的列的写入是原子的(即对行的操作要么成功,要么失败);
大容量
一个表可以有上亿行,上百万列,数千个版本,TB 或 PB级的存储;
面向列
面向列(族)的存储和权限控制,列(族)独立检索。动态增加列;
稀疏
对于为空(null)的列,并不占用存储空间,表可以设计的非常稀疏;
数据版本多
每个单元中的数据可以有多个版本;
数据类型单一
Hbase中的数据都是字符串,没有其他类型;
实质上是一张极大的、非常稀疏的,存储在分布式文件系统上的表。
Hbase 的框架
Hbase 的集群结构
集群中几个主要组件
客户端库(API) 、 一台主服务器(Master) 、 多台Region 服务器(RegionServer) 、 Zookeeper,具体模块如下:
组件说明
1.客户端库, 可以通过 HBase 提供的各式语言API 库访问集群。API 库也会维护一个本地缓存来加快对 HBase 对访问,比如缓存中记录着 Region 的位置信息;
2.Maste 节点, 主要为各个 RegionServer 分配 Region,负责 RegionServer 对负载均衡,管理用户对于 Table 对 CRUD 操作;
3.RegionServer, 维护 Region,处理对这些 Region 对IO 请求,负责切分在运行过程中变过大的 Region;
4.Zookeeper 的作用是非常重要的。Zookeeper 保证了至少有一个 Master 处于运行状态,同时Zookeeper 也负责 Region 和 Region Server 的注册。
PS:Zookeeper发展到目前,已经成为了分布式大数据技术中容错性的标准框架,几乎所有的分布式大数据相关的开源框架,都依赖于Zookeeper实现HA。
一个 HBase 集群一般包括一个 Master 和多个 RegionServer 。