HBase基础知识
HBase是一个开源的、分布式的、非关系型的列族数据库。HBase位于Hadoop生态系统的结构化存储层,数据存储于分布式文件系统HDFS中,并且使用ZooKeeper作为协调服务。HDFS为HBase提供了高可靠性的底层存储支持,MapReduce为HBase提供了高性能的计算能力,ZooKeeper则为HBase提供了稳定的服务和失效恢复机制。HBase的设计目的是处理非常庞大的表,甚至可以使
HBase简介
HBase是一个开源的、分布式的、非关系型的列族数据库。HBase位于Hadoop生态系统的结构化存储层,数据存储于分布式文件系统HDFS中,并且使用ZooKeeper作为协调服务。HDFS为HBase提供了高可靠性的底层存储支持,MapReduce为HBase提供了高性能的计算能力,ZooKeeper则为HBase提供了稳定的服务和失效恢复机制。
HBase的设计目的是处理非常庞大的表,甚至可以使用普通计算机处理超过10亿行的、由数百万列组成的表的数据。由于HBase依赖于HDFS,因此它与Hadoop一样,主要依靠横间扩展,并不断增加廉价的商用服务器来提高计算和存储能力。
HBase也可以直接使用本地文件系统而不用HDFS作为底层数据存储方式,不过,为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,一般都是用HDFS作为HBase的底层数据存储系统。
HBase与关系数据库的区别
数据类型
关系数据库采用关系模型,具有丰富的数据类型和存储方式。HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。
数据操作
关系数据库中提供了丰富的操作,如插入、删除、更新、查询等,其中会设计复杂的多表连接,通常借助于多个表之间的主外键关联来实现。HBase提供的操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等。因为HBase在设计上避免了复杂的表与表之间的关系,通常只采用单表的主键查询,所以它无法实现像关系数据库中那样的表与表之间的连接操作。
存储模式
关系数据库是基于行模式存储的,元组或行会被连续地存储在磁盘页中。在读取数据时,需要顺序扫描每个元组,然后从中筛选出查询所需要的属性。如果每个元组只有少量属性的值是对查询有用的,那么基于行模式存储就会浪费许多磁盘空间和内存带宽。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,它的优点是:可以降低I/O开销,支持大量并发用户查询(因为仅需要处理可以回答这些查询的列,而不需要处理与查询无关的大量数据行),同一个列族中的数据会被一起压缩(由于同一列族内的数据相似度较高,因此可以获得较高的数据压缩比)。
数据索引
关系数据库通常可以针对不同列构造复杂的多个索引,以提高数据访问性能。与关系数据库不同的是,HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。由于HBase位于Hadoop框架之上,因此可以使用MapReduce来快速、高效地生成索引表。
数据维护
在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据的旧的版本,而是生成一个新的版本,旧的版本仍然保留。
可伸缩性
关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase这些分布式数据库就是为了实现灵活的横向扩展而开发的,因此能够轻易地通过在集群中增加或者减少硬件数量来实现性能的压缩。
HBase基本结构
命名空间
命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。
表
在HBase中,数据存储在表中,表名是一个字符串,表由行和列组成。与关系数据库不同,HBase表是多维映射的。HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。
行
HBase中的行由行键和一个或多个列组成。行键没有数据类型,总时视为字节数组byte[]。行键类似于关系数据库中的主键索引,在整个HBase表中是唯一的,但与关系数据库不同的是,行键是按照字母顺序排序的。因此,行键的设计非常重要,利用这个特性就可以将相关的数据排列在一起。
列族
HBase列族由多个列组成,相当于将列进行分组。列的数量没有限制,一个列族可以有数百万个列。表中的每一行都有同样的列族。列族必须在表创建的时候指定,不能轻易修改,且数量不能太多,一般不超过3个。列族名的类型是字符串。
列限定符
列限定符用于代表HBase表中列的名称,列族里的数据通过列限定符来定位,常见的定位格式为“family:qualifier"。(例如,要定位列族cf1中的列name,则使用cf1:name)。HBase中的列族和列限定符都可以理解为列,只是级别不同。一个列族下面可以有多个列限定符,因此列族可以简单地理解为第一级列,列指定符是第二级列,两者是父子关系。与行键一样,列限定符没有数据类型,总是视为字节数组byte[]。
单元格
单元格通过行键、列族和列限定符一起来定位。单元格包含值和时间戳。值没有数据类型,总是视为字节数组byte[],时间戳代表该值的版本,类型为long。默认情况下,时间戳表示数据写入服务器的时间,但是当数据放入单元格时,也可以指定不同的时间戳。每个单元格都根据时间戳保持着同一份数据的多个版本,且降序排列,即最新的数据排在前面,这样有利于快速查找最新数据。对单元格中的数据进行访问的时候会默认读取最新的值。
HBase集群架构
HBase架构采用主从方式,由三种类型的节点组成——HMaster节点、HRegionServer节点和ZooKeeper集群。HMaster节点作为主节点,HRegionServer节点作为从节点,这种主从模式类似于HDFS的NameNode与DataNode。
HBase集群中所有的节点都是通过ZooKeeper来进行协调的。HBase底层通过HRegionServer将数据存储与HDFS中。Hbase客户端通过RPC方式与Master节点和HRegionServer节点通信,HMaster节点连接ZooKeeper获得HRegionServer节点的状态并对其进行管理。由于HBase将底层数据存储与HDFS中,因此也涉及NameNode节点和DataNode节点等。HRegionServer经常与HDFS的DataNode在同一节点上,有利于数据的本地化访问,节省网络传输时间。
HMaster
HMaster节点并不是只有一个,用户可以启动多个HMaster节点,并通过ZooKeeper的选举机制保持同一时刻只有一个HMaster节点处于活动状态,其他HMaster处于备用状态(一般情况下只会启动两个HMaster)。
HMaster节点本身并不存储HBase的任何数据,它主要用于管理HRegionServer节点,指定HRegionServer节点可以管理那些HRegion,以实现其负载均衡。当某个HRegionServer节点宕机时,HMaster会将其中的HRegion迁移到其他的HRegionServer上。HMaster还管理用户对表的增删查改等操作,管理表的元数据(每个HRegion都有一个唯一标识符,元数据主要保存HRegion的唯一标识符和HRegionServer的映射关系)。HMaster还负责权限控制。
HRegion
HBase使用行键自动把表水平切分成多个区域,这个区域成为HRegion。每个HRegion由表中的多行数据组成。最初一个表只有一个HRegion,随着数据的增多,当数据大到一定的值后,便会在某行的边界上将表分割成两个大小基本相同的HRegion。然后由HMaster节点将HRegion分配到不同的HRegionServer节点中(同一张表的多个HRegion可以分配到不同的HRegionServer中),由HRegionServer对其进行管理以及相应客户端的读写请求。分布在集群中的所有HRegion按序排列就组成了一张完整的表。
每一个HRegion都记录了起始行键和结束行键,第一个HRegion的起始行键为空,最后一个HRegion的结束行键为空。客户端可以通过HMaster节点快速定位到每个行键所在的HRegion。
HRegionServer
HRegionServer一般和DataNode在同一台机器上运行,实现数据的本地性。RegionServer是客户端角色,是通过RPC协议与HMaster和Client进行通信的。HRegionServer为HRegion的管理者,主要负责对数据的操作,例如:get,put,delete。每个HRegion只能被一个HRegionServer提供服务,HRegionServer可以同时服务多个HRegion,来自不同HRegionServer上的HRegion组合成表格的整体逻辑视图。
Store
一个Store存储HBase表的一个列族的数据。由于表被水平分割成多个HRegion,那么一个HRegion中包含一个或多个Store。Store中包含一个MemStore和多个HFile文件。MemStore相当于一个内存缓冲区,数据存入磁盘之前会线存入MemStore中,当MemStore中的数据大小达到一定的值后,会生成一个HFile文件,MemStore中的数据会转移到HFile文件中(也可以手动执行HBase命令,将MemStore中的数据转移到HFile文件),StoreFile是对HFile文件的封装,HFile是HBase底层的数据存储格式,最终数据以HFile的格式存储在HDFS中。
一个HFile文件只存放某个时刻MemStore中的所有数据,一个完整的行数据可能存放在多个Hfile里。
HLog
HLog是HBase的日志文件,记录数据的更新操作。与关系数据库类似,为了保证数据的一致性和实现回滚等操作,HBase在写入数据时会先进行WAL(预写日志)操作,即将更新操作写入HLog文件中,然后才会将数据写入Store的MemStore中,只有这两个地方都写入并确认后,才认为数据写入成功。由于MemStore是将数据存入内存中,且数据大小没有达到一定值时不会写入到HDFS,若在数据写入HDFS之前服务器崩溃,则MemStore中的数据将丢失,此时可以利用HLog来恢复丢失的数据。HLog日志文件存储于HDFS中,因此若服务器崩溃,HLog仍然可用。
ZooKeeper
每个HRegionServer节点会在ZooKeeper中注册一个自己的临时节点,HMaster通过这些临时节点发现可用的HRegionServer节点,跟踪HRegionServer节点的故障等。HBase利用ZooKeeper来确保只有一个活动的HMaster在运行。HRegion应该分配到哪个HRegionServer节点上,也是通过ZooKeeper得知的。
HDFS
HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。
HBase读写流程
写流程
1.Client先访问ZooKeeper,获取Hbase的元数据表位于哪个HRegionServer。
2.访问对应的HRegionServer,获取Hbase的元数据表,根据读请求的命名空间、表和行键,查询出目标数据位于哪个HRegionServer中的哪个HRegion中。并将该表的HRegion信息以及元数据表的位置信息缓存在客户端的meta cache,方便下次访问。
3.与目标HRegionServer进行通讯。
4.将数据顺序写入(追加)到 WAL。
5.将数据写入对应的MemStore,数据会在 MemStore 进行排序。
6.向客户端发送ack。
7.等达到MemStore的刷写时机后,将数据刷写到HFile。
读流程
1.Client先访问ZooKeeper,获取Hbase的元数据表位于哪个HRegionServer。
2.访问对应的HRegionServer,获取Hbase的元数据表,根据读请求的命名空间、表和行键,查询出目标数据位于哪个HRegionServer中的哪个HRegion中。并将该表的HRegion信息以及元数据表的位置信息缓存在客户端的meta cache,方便下次访问。
3.与目标HRegionServer进行通讯。
4.分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
5.将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到Block Cache。
6.将合并后的最终结果返回给客户端。
HBase的运行模式
单机模式
在单机模式中,HBase的数据存储于本地文件系统而不是HDFS,所有的HBase守护进程和ZooKeeper运行于同一个JVM中,即HMaster、一个HRegionServer和ZooKeeper守护进程。并且ZooKeeper被绑定到一个开放的端口,这样客户端就可以连接到HBase了。
伪分布模式
伪分布模式是一种运行在单个节点(单台计算机)上的分布式模式,HBase的每一个守护进程(HMaster、HRegionServer和ZooKeeper)都作为一个单独的进程来运行。
集群模式
HBase集群建立在Hadoop集群的基础上,而且依赖于ZooKeeper,因此在搭建HBase集群之前,需要将Hadoop集群和ZooKeeper集群搭建好。
更多推荐
所有评论(0)