HBase简介
- 前言
Hadoop已经包括了HDFS和MapReduce,可以很好的解决大规模数据的离线批量处理,但是受限于MR架构的高延迟数据处理机制,使得Hadoop不能满足大规模数据实时处理应用;HDFS面向批量访问模式,不是随机访问模式;传统的通用关系型数据库无法应对在数据规模剧增时导致的系统扩展性和性能问题(分库分表也不能很好解决);传统关系型数据库在数据结构发生变化时一般需要停机维护,空列浪费存储空间。
- HBase与RDBM数据库(Relational DataBase Management)对比
- 数据类型:RDBM采用关系模型,具有丰富的数据类型和存储方式。HBase采用了更为简单的数据模型把数据存储为未经解释的字符串;
- 数据操作:RDBM包含丰富的操作,涉及复杂的多表关联。HBase操作不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,这是因为HBase在设计的时候就避免了复杂的表与表之间的关系;
- 存储模式:RDBM是基于行模式存储的,HBase是基于列模式存储的,每个列族都由几个文件保存,不同列族的文件是分离的;
- 数据索引:RDBM会针对不同列构建复杂的索引,以提高数据查询性能、HBase只有一个索引----RowKey,通过巧妙的设计,HBase的所有访问方式:通过rowkey访问、或者通过rowkey扫描,从而使整个系统不会慢下来;
- 数据维护:RDBM中更新数据操作,会用最新的当前值替换旧值,旧值就不会存在。HBase执行更新时,并不会删除旧版本数据,而是生成新的版本;
- 可伸缩性:RDBM很难实现横向扩展,纵向扩展的能力也有限。相反HBase分布式数据库就是为了实现灵活的水平扩展,能够轻松的通过在集群中增加或者减少硬件数量来实现性能的伸缩。
- HBase数据模型
HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。
每个值都是未经解释的字符串,没有数据类型,在表中存储数据每一行都有一个可排序的行键和任意多的列;表在水平方向上由一个或多个列族组成,每个列族可以包含任意多的列,同一个列族里边的数据存储在一起;列族支持动态扩展,可以很轻松的添加一个列族和列,无需预先定义列的数量以及类型,所有的列均以字符串的形式存储,用户需要自行进行数据转换;HBase在执行更新操作时,不会删除旧版本的数据,而是生成新的版本,旧版本仍然保留(这跟HDFS只能追加不允许修改的原因有关)。
- HBase工作原理
主要包括三个功能组件:库函数:链接到每个客户端、一个HMaster主服务器、许多个HRegion服务器。
HMaster负责管理和维护HBase表的分区信息,维护region服务器列表,分配region,负载均衡。
Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求。
客户端并不是从Master上读取数据,而是在获得region的存储位置信息后,直接从region服务器上读取数据。
客户端并不依赖Master而是通过ZK来获得region位置信息,大多数客户端甚至从来不和Master进行通信,这种设计方式使得Master的负载很小。
表和Region的关系:
一个HBase表被分为多个region。开始只有一个region,随着数据增加,后台不断分裂,region拆分操作非常快,接近瞬间,因为拆分之后,region读取的仍然是原存储文件,直到“合并”过程把存储文件异步写到独立的文件,才会读取新文件。
Region定位:
元数据表,又名.META.表,存储了region和region服务器的映射关系。当HBase表很大时,元数据表也会分裂成多个region;
根数据表,又名-ROOT-表记录所有元数据的具体位置,根数据表只有一个region,名字在程序中被写死,ZK中记录了-ROOT-表的位置
HBase三层结构:
客户端访问数据的“三级寻址”:
为了加速寻址,客户端会缓存位置信息,同时需要解决缓存失效的问题;寻址过程只需要询问ZK,不需要连接Master服务器。
- HBase系统架构