HBase 是一种高可靠,高性能,面向列,可伸缩的分布式数据,是谷歌BigTable 的开源实现,主要用来提供存储非结构化和半结构化的松散数据。Hbase 的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和百万列元素组成的数据表。
该技术来源于Chang et al所撰写的 Google论文“Bigtable:一个结构化数据的分布式存储系统”。
就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样, HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop 项目的子项目。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不 同的是HBase基于列的而不是基于行的模式
什么情况下使用Hbase?
成熟的数据分析主题,查询模式已经确立并且不轻易改变
传统的关系型数据库已经无法承受负荷,高速插入,大量读取
适合海量的,但同时也是简单的操作(例如key-value)
关系型数据库的困难
简单的事情只要上了量就会变成无比复杂的事情
Order by耗费很多性能
大量发生,但又无法分布式处理
顾客需要实时看到自己的足迹,因此不能使用缓存技巧
Hbase迎接挑战
天生就是面向时间戳查询
基于行键的查询异常快速,特别是最近的数据被放在内存的memstore里,完全没有 IO开销
分布式化解负荷
模式设计
行键:userid
列族和列:book:bookid
为了充分利用分布式,可以用reverse key,hash等技巧改造行键
Hbase 概述
HBase 的服务体系结构
HBase 介于NoSQL和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过Hive支持多表join等复杂动作)。与Hadoop 一样,BHase 的目标主要是依靠横向扩展,通过不断增加廉价商用服务器来增加计算和存储能力。
Hadoop 生态圈中HBase 与其他部分关系的关系,可看出HBase 位于HBase 位于Hadoop 生态圈中结构化存储,HDFS为HBase 提供了可靠的底层存储支持,hadoop Mapreduce 为HBase 提供高性能计算能力,Zookeeper为HBase 提供稳定服务和Failover 机制。
Pig 和Hive 还位HBase 提供高层语言支持,使得HBase 上进行数据统计处理变得非常简单。Sqoop 则为HBase 提供方便的RDBMS 数据导入功能,使得传统数据库数据向HBase 中迁移变得非常方便。
HBase 的服务器架构
HBase 的服务器体系结构遵从主从服务器的架构,它由HRegion 服务器群和HBase Master 服务器构成。HBase Master 服务器负责管理器所有的HRegion 服务器,而HBase 中所有的服务器都是通过Zookeeper 来进行协调,并处理HBase 服务器运行期间可能遇到的错误。HBase 逻辑上的表可能会被划分多个HRegion,然后存储HRegion服务器中。
当表的大小超过设置值的时候,HBase 会自动将表划分为不同区域,每个区域包含所有行的一个子集,靠主键来区分。从物理上来看,一张表被划分为多个块,每个块就是一个HRegion。 用表名+开始、结束主键来区分每一个HRegion,一个HRegion 会保存一个表里面的某段连续的数据,从开始键到结束主键,一张完整的表格式保存在多个HRegion中,每一个区段的HRegion 只会被一个HRegion 服务器维修。
数据的更新
当用户需要更新数据的时候,就会被分配到对应的HRegion 服务器上提交修改,这些修改先是被写到Hmencache 缓存和服务器的Hlog里面,其中Hmemcache 是内存中的缓存,保存最近更新的数据;Hlog 是磁盘上面的记录文件,它记录着所有更新的数据操作,在操作写入Hlog之后,commit() 调用才会将返回给客户端。
读取数据的时候,HRegion 服务器会先访问Hmencache 缓存,如果缓存里面没有该数据,才会回到HStores 磁盘上面寻找,每一列簇都会有一个HStores 集合,每个HStores 集合包括很多集合的HStoreFiles 文件,这些文件都是B树结构的。
系统会定期调用HRegion.flushcache ()把缓存中的内容写到文件夹中,一般会增加到一个新的HStoresFiles 文件,而此时高速缓存会被清空,并且会写到一个标记Hlog上,表示上面的内容已经被写入到文件中保存。
启动时,每台HRegion 服务器都会检查自己的Hlog 文件,查看最近一次执行flushcache 之后有没有新的更新写入操作,如果没有就表示所有数据都已经更新到文件夹中了;如果有更新。服务器就会先把这次更新写入到高速缓存,然后调用flushcache 写入文件中。最后服务器会删除旧的Hlog 文件,并开始让用户访问数据。Hlog 会定期地回滚,回滚时后按照时间备份文件的,每次回滚,系统会删除那些已经被写入到文件中的更新。
HRegion和HMaster 二者之间的关系
HMaster的主要任务
每台HRegion 服务器都会和HMaster 服务器通信,HMaster的主要任务是告诉每台HRegion 服务器它要维护哪些HRegion。当一台新的HRegion服务器登录HMaster 服务器时,HMaster 会告诉它先等待分配数据。而当每一台HRegion 服务器死机时,HMaster 会把它负责的HRegion标记为未分配,然后再把他们分配到其他HRegion服务器中。
HMaster 在功能上主要负责Table和Region 的管理工作,具体包括:
1.管理用户对Table 的增,删,改,查操作;
2.管理HRegionServer 的负载均衡,调整Region 分布;
3.在Region Split 后,负责新的Region 的分配;
4.在HRegionServer 停机后,负责失效HRegionServer 上的Region 迁移。
每个Region需要一个唯一的regionId来表示它,所以HRegion 的表达符最后是:表名+开始主键+唯一ID,可以用来标识符来区分不同的HRegion,这些数据就是元数据。而元数据本身就是被本身保存在HRegion 得标识符和实际的HRegion 服务器的映射关系。元数据表也会增长,并且可能被分割为几个HRegion,为了定位这些HRegion,采用了一个跟数据表(ROOT Table),它保存了所有数据表的位置,而根数据表是不能被分割的,永远只存在于一个HRegion 。表中的项使用区域名作为键值,区域名由所属的表明,区域的起始行,区域的起始行,区域的创建时间以及对其整个进行的MD5 哈希值组成。
HMaster 的管理
HBse 依赖与ZooKeeper,默认情况下,它管理一个Zookeeper 实例,作为集群的authority。HBase 负责跟目录的表位置,当前集群主控地址等类似重要信息的管理。如果区域分配过程中有服务器奔溃,就通过Zookeeper 来协调分配。在Zookeeper 上管理事务的状态有助于恢复时间可以从奔溃服务器遗留的状态开始继续分配。在启动一个客户端到HBase集群的连接时,客户端必须至少拿到集群传递的Zookeeper整体的位置。这样,客户端才能访问Zookeeper 层次,了解集群的属性。
新连接到Zookeeper 集群上的客户端首先查找Root 表的位置,然后客户端通过root 获取所请求行所在范围所属的meta 区域位置。客户端接着查找meta 区域来获取用户控件区域所在节点及其位置。接着,客户端就可以直接和管理那个区域的RegionServer进行交互。
每个行操作可能要访问三次远程节点。为了节省这些开销,客户端会缓存它遍历root 时获取的信息和meta位置以及用户控件区域的开始行进行和结束行。这样,以后不需要再访问meta 表也能得知区域存放的位置。客户端在碰到错误之前会直接使用所缓存的项,而当发生错误时,客户端会再查看meta 获取区域的新位置。如果meta 区域也被移动,客户端会再去查看root。
到达Regionserver 的写作操作首先追加到“提交日志",然后加入内存中的memstore 。然后加入内存中的memstore ,如果memstore 慢,它的内存会被flush 到文件系统。
HBase 数据类型
HBase 以表的形式存储数据,表由行和列组成,列又划分若干列族(row family),HBase 的表如下所示:
1.Row Key:行键,Table 的主键,Table 中的记录按照Row Key排序;
2.Timestamp:时间戳,每次数据操作对应时间戳,可以看做是数据的version number ;
3.Column Family:列簇,Table 在水平方向有一个或者多个Column Family 组成,一个Column Family 中可以由多个任意的多个Column组成,也即Column Family 支持动态扩展,无需预先定义Column 的数量以及类型,所有Column 均以二进制格式存储,用户需要自行进行类型转换。
cell
由{row key,column(=<family>+<label>),version} 唯一确定的单元。cell 中的数量是没有类型的,全部字节码形式存储。
HBase 的特点
1.数据类型:HBase 只有简单的字符串类型,所有类型都是交由用户自己处理,HBase 只保存字符串。而非关系型数据库则有着丰厚的数据类型选择和存储类型。
2.数据操作:HBase 操作只有很简单的插入,查询,删除,清除等,表和表之间分离的,没有复杂的表和表之间的关系,所以也不能实现表和表之间的关联等操作。而传统数据库通常有各种各样的函数,连接等操作。
3.存储模式:HBase 是基于列存储的,每个列族都有几个文件保存。不同列族的文件是分离的。传统关系数据库是基于表格结构和行模式保存的。
HBase 与其它服务器的区别
HBase 与关系型数据库有着很根本性的不同,它按照Bigtable 的思想来开发的,套用了Bigtable 的定义就是:Bigtable 是一个稀疏的,分布的,持续性多维度的排序映射数组。HBase 是一个基于列模式的映射数据库,它只是表示很简单的键——数据映射关系,它大大简化了传统的关系型数据库。
Hbase 功能
1.数据维护:HBase 的数据更新准确的说应该不叫更新,而是一个主键或者列对应的新的版本,而它旧的版本仍然会保留,所以它实际是插入新的数据,而不向传统关系型数据库里面替换修改。
2.可伸缩的:HBase 和Bigtable这类分布式数据库就是为了快速查询这个目的开发出来的,他能够容易地添加或者减少(在硬件错误的时候)硬件数量,而是对错误的兼容性比较高。而传统的关系型数据库通常需要增加中间层才能实现类似的功能。
当前数据库基本都是从上世纪70年代发展过来的,它们都是从下述体系特点:面向存储索引结构;多线程访问;基于锁的同步访问机制;基于log 记录的恢复机制。
而HBase 之类基于列模式存储的分布式数据库,更能适应海量存储和互联网应用需求,灵活的分布式架构可以使利用廉价的硬件设备就组建一个大型的数据仓库,互联网是以字符为基础的,HBase 针对这些应用开发出来的数据库系统。
由于其中的时间戳特性,HBase 与生俱来就特别适合开发wiki,archiverorg之类的服务,而HBase 直接作为一个搜索引擎的一部分被开发出来的。
HBase 是非结构化数据存储的数据库,同时它基于列模式存储,这些特性决定了HBase 的数据库结构非常松散,字段内容单一,表与表之间没有任何关系,也因为这样,HBase 才查询的时候效率非常高。