1. Hbase是什么
HBase 是一个开源的、分布式的、版本化的非关系型数据库,它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。
HBase 是非关系型数据库,它不具备关系型数据库的一些特点,例如,它不支持 SQL 的跨行事务,也不要求数据之间有严格的关系,同时它允许在同一列的不同行中存储不同类型的数据。
尽管已经有许多数据存储和访问的策略和实现方法,但事实上大多数解决方案,特别是一些关系类型的,在构建时并没有考虑超大规模和分布式的特点。可以通过复制和分区的方法来扩充数据库使其突破单个节点的界限,但这些功能通常都是事后增加的,安装和维护都和复杂。同时,也会影响RDBMS的特定功能,例如联接、复杂的查询、触发器、视图和外键约束这些操作在大型的RDBMS上的代价相当高,甚至根本无法实现。
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。Hbase对海量数据的响应能力和良好的扩展性,使得HBase成为大数据发展的必然产物
HBase 是Google Bigtable 的开源实现,与Google Bigtable 利用GFS作为其文件存储系统类似, HBase 利用Hadoop HDFS 作为其文件存储系统;Google 运行MapReduce 来处理Bigtable中的海量数据, HBase 同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable 利用Chubby作为协同服务, HBase 利用Zookeeper作为对应。
2. Hbase的特点
以上的表述可以从感性的角度了解Hbase的特点 以及它和关系型数据库的区别 简单总结就是 传统的关系型数据库 在面对海量数据存储的时候 代价高 响应慢 而Hbase则可以较低的成本完成海量数据的储存和相应
下边 我们详细了解一下Hbase的特点
海量存储
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利
列式存储
这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
极易扩展
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
可以通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。也可以通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
另外,HBase 的扩展是热扩展,即在不停止现有服务的前提下,可以随时添加或者减少节点。
高并发
由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务
稀疏性
稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的
3. Hbase架构和相关组件
Master
HBase Master(有时简称Hmaster)用于协调多个Region Server(有时简称Hregionserver),侦测各个RegionServer之间的状态,并平衡RegionServer之间的负载。HBaseMaster还有一个职责就是负责分配Region给RegionServer。HBase允许多个Master节点共存,但是这需要Zookeeper的帮助。当多个Master节点共存时,只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点宕机时,其他的Master则会接管HBase的集群
Region Server
对于一个RegionServer而言,其包括了多个Region。RegionServer的作用只是管理表格,以及实现读写操作。Client直接连接RegionServer,并通信获取HBase中的数据。对于Region而言,则是真实存放HBase数据的地方,也就说Region是HBase可用性和分布式的基本单位。如果当一个表格很大,并由多个CF(cow family 也称列族)组成时,那么表的数据将存放在多个Region之间,并且在每个Region中会关联多个存储的单元(Store)
Zookeeper
Zookeeper是HBase Master的HA解决方案,保证了至少有一个HBase Master 处于运行状态。另外,Zookeeper负责Region和Region Server的注册。其实Zookeeper发展到目前为止,已经成为了分布式大数据框架中容错性的标准框架。不光是HBase,几乎所有的分布式大数据相关的开源框架,都依赖于Zookeeper实现HA
HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为Hbase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:
- 提供元数据和表数据的底层分布式存储服务
- 数据多副本,保证的高可靠和高可用性
API
应用访问Hbase的应用接口,有了这个接口才可以完成应用对于Hbase中数据的访问
4. Hbase数据模型
Column Family 也称为列族 列族的存在和特点 可以让用户动态增加列数据
Row key 也称为行键 可以通过它来对数据进行排序
假如系统中有一个User表,如下图,如果按照传统的RDBMS的话,User表中的列是固定的,比如schema 定义了name,major,email等属性,User的属性是不能动态增加的。但是如果采用列存储系统,比如Hbase,那么我们可以定义User表,然后定义info 列族,User的数据可以分为:info:name = zhangsan,info:major=Math,info:email=luo@qq.com等,如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了 如 info:age
下边我们用Hbase表的逻辑数据模型来做进一步说明
行键
表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族里的数据存储在一起,每个Hbase表都由若干行组成,每一行都由行键标识
列族
上表中的info就是列族,支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换。一个Hbase表被分为多个列族的集合,他们是最基本的访问控制单元。
列限定符
列限定符其实解释列的属性 可以对比关系型数据库的字段去理解
单元格
在Hbase表中 通过行键、列族、列限定符可以为以确定给一个单元格
时间戳
HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留(这是和HDFS只允许追加不允许修改的特性相关的),每个单元格都可能会保留同一个数据的多个版本,这些版本采用时间戳进行标记 关于时间戳 如下图 可以看得更清晰
基于对于上述理论的了解,我们可以知道,HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即[行键,列族, 列限定符,时间戳] 如下表所示的样式
键 | 值 |
[“201505003”,“Info”,“email”, 1174184619081] | “xie@qq.com” |
[“201505003”,“Info”,“email”, 1174184620720] | “you@163.com” |
需要说明的几个点:
- 上图是Hbase表的逻辑数据模型 而不是物理存储方式,是为了方便理解Hbase的数据模型而进行的举例
- 关系型数据库中的表为每个列预留了存储空间,即表 1 中的空白 Cell 数据在关系型数据库中以“NULL”值占用存储空间,在Hbase中,空白 Cell 在物理上是不占用存储空间的,即不会存储空白的键值对,一次,如上表,如果一个请求为获取 RowKey 为 0001 在 T2 时间的 Stulnfo:class 值时,其结果为空
- 与面向行存储的关系型数据库不同,HBase 是面向列存储的,且在实际的物理存储中,列族是分开存储的,即表 1 中的学生信息表将被存储为 Stulnfo 和 Grades 两个部分
如下,表 2 展示了 Stulnfo 这个列族的实际物理存储方式,列族 Grades 的存储与之类似。在表 2 中可以看到空白 Cell 是没有被存储下来的。
5. 参考资料
http://c.biancheng.net/view/6517.html