揭开hbase的神秘面纱
1.1 欢迎使用 apache hbase
1.1.1 什么是 hbase?
1.1.2 hbase的前世今生
- apache hbase 是一个开源、分布式、版本化、非关系数据库, 模仿了 google 的bigtable: chang等人的结构化数据分布式存储系统。
- apache hbase 在 hadoop 和 hdfs 之上提供类似 bigtable 的功能,正如 bigtable 利用 google 文件系统提供的分布式数据存储一样,
1.1.3 hbase的技术选型?
那么当企业有什么业务场景下的时候,可以尝试使用 apache hbase呢?
1.1.3.1 不适合使用 hbase的场景
当你的情况大体上符合以下任意一种的时候:
- 主要需求是数据分析,比如做报表。
- 单表数据量不超过千万。
请不要使用hbase,使用mysql或者oracle之类的产品可以让你的脑细胞免受折磨。
1.1.3.2 适合使用 hbase的场景
当你的情况是:
- 单表数据量超千万,而且并发还挺高。
- 数据分析需求较弱,或者不需要那么灵活或者实时。请使用hbase,它不会让你失望的。
请使用hbase,它不会让你失望的。
1.1.4 hbase的特点
1.1.4.1 hbase的优点
与其他数据库相比,hbase在系统设计以及实际实践中有很多独特的优点。
1.1.4.2 hbase的缺点
任何一个系统都不会完美,hbase也一样。hbase不能适用于所有应用场景,例如:
可以看到,hbase系统本身虽然不擅长某些工作领域,但是借助于hadoop强大的生态圈,用户只需要在其上架设phoenix
组件、spark
组件或者其他第三方组件,就可以有效地协同工作。
1.1.5 hbase设计架构
hbase体系结构如图1-6所示。
1.2 附录
1.2.1功能模块与职责详情
功能模块 | 功能职责 |
---|---|
client(hbase客户端) | hbase客户端(client)提供了shell命令行接口、原生java api编程接口、thrift/rest api编程接口以及mapreduce编程接口。hbase客户端支持所有常见的dml操作以及ddl操作,即数据的增删改查和表的日常维护等。其中thrift/rest api主要用于支持非java的上层业务需求,mapreduce接口主要用于批量数据导入以及批量数据读取。hbase客户端访问数据行之前,首先需要通过元数据表定位目标数据所在regionserver,之后才会发送请求到该regionserver。同时这些元数据会被缓存在客户端本地,以方便之后的请求访问。如果集群regionserver发生宕机或者执行了负载均衡等,从而导致数据分片发生迁移,客户端需要重新请求最新的元数据并缓存在本地。 |
zookeeper | zookeeper(zk)也是apache hadoop的一个顶级项目,基于google的chubby开源实现,主要用于协调管理分布式应用程序。在hbase系统中,zookeeper扮演着非常重要的角色。•实现master高可用:通常情况下系统中只有一个master工作,一旦active master由于异常宕机,zookeeper会检测到该宕机事件,并通过一定机制选举出新的master,保证系统正常运转。•管理系统核心元数据:比如,管理当前系统中正常工作的regionserver集合,保存系统元数据表hbase:meta所在的regionserver地址等。•参与regionserver宕机恢复:zookeeper通过心跳可以感知到regionserver是否宕机,并在宕机后通知master进行宕机处理。•实现分布式表锁:hbase中对一张表进行各种管理操作(比如alter操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他rdbms表不同,hbase中的表通常都是分布式存储,zookeeper可以通过特定机制实现分布式表锁 |
master | zookeeper(zk)也是apache hadoop的一个顶级项目,基于google的chubby开源实现,主要用于协调管理分布式应用程序。在hbase系统中,zookeeper扮演着非常重要的角色。•实现master高可用:通常情况下系统中只有一个master工作,一旦active master由于异常宕机,zookeeper会检测到该宕机事件,并通过一定机制选举出新的master,保证系统正常运转。•管理系统核心元数据:比如,管理当前系统中正常工作的regionserver集合,保存系统元数据表hbase:meta所在的regionserver地址等。•参与regionserver宕机恢复:zookeeper通过心跳可以感知到regionserver是否宕机,并在宕机后通知master进行宕机处理。•实现分布式表锁:hbase中对一张表进行各种管理操作(比如alter操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他rdbms表不同,hbase中的表通常都是分布式存储,zookeeper可以通过特定机制实现分布式表锁 |
regionserver | regionserver主要用来响应用户的io请求,是hbase中最核心的模块,由wal(hlog)、blockcache以及多个region构成。• wal(hlog):hlog在hbase中有两个核心作用——其一,用于实现数据的高可靠性,hbase数据随机写入时,并非直接写入hfile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入hlog,这样,即使缓存数据丢失,仍然可以通过hlog日志恢复;其二,用于实现hbase集群间主从复制,通过回放主集群推送过来的hlog日志实现主从复制。• blockcache:hbase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。blockcache缓存对象是一系列block块,一个block默认为64k,由物理上相邻的多个kv数据组成。blockcache同时利用了空间局部性和时间局部性原理,前者表示最近将读取的kv数据很可能与当前读取到的kv数据在地址上是邻近的,缓存单位是block(块)而不是单个kv就可以实现空间局部性;后者表示一个kv数据正在被访问,那么近期它还可能再次被访问。当前blockcache主要有两种实现——lrublockcache和bucketcache,前者实现相对简单,而后者在gc优化方面有明显的提升。• region:数据表的一个分片,当数据表大小超过一定阈值就会“水平切分”,分裂为两个region。region是集群负载均衡的基本单位。通常一张表的region会分布在整个集群的多台regionserver上,一个regionserver上会管理多个region,当然,这些region一般来自不同的数据表。一个region由一个或者多个store构成,store的个数取决于表中列簇(column family)的个数,多少个列簇就有多少个store。hbase中,每个列簇的数据都集中存放在一起形成一个存储单元store,因此建议将具有相同io特性的数据设置在同一个列簇中。每个store由一个memstore和一个或多个hfile组成。memstore称为写缓存,用户写入数据时首先会写到memstore,当memstore写满之后(缓存数据超过阈值,默认128m)系统会异步地将数据f lush成一个hfile文件。显然,随着数据不断写入,hfile文件会越来越多,当hfile文件数超过一定阈值之后系统将会执行compact操作,将这些小文件通过一定策略合并成一个或多个大文件 |
master | zookeeper(zk)也是apache hadoop的一个顶级项目,基于google的chubby开源实现,主要用于协调管理分布式应用程序。在hbase系统中,zookeeper扮演着非常重要的角色。•实现master高可用:通常情况下系统中只有一个master工作,一旦active master由于异常宕机,zookeeper会检测到该宕机事件,并通过一定机制选举出新的master,保证系统正常运转。•管理系统核心元数据:比如,管理当前系统中正常工作的regionserver集合,保存系统元数据表hbase:meta所在的regionserver地址等。•参与regionserver宕机恢复:zookeeper通过心跳可以感知到regionserver是否宕机,并在宕机后通知master进行宕机处理。•实现分布式表锁:hbase中对一张表进行各种管理操作(比如alter操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他rdbms表不同,hbase中的表通常都是分布式存储,zookeeper可以通过特定机制实现分布式表锁 |
hdfs | hbase底层依赖hdfs组件存储实际数据,包括用户数据文件、hlog日志文件等最终都会写入hdfs落盘。hdfs是hadoop生态圈内最成熟的组件之一,数据默认三副本存储策略可以有效保证数据的高可靠性。hbase内部封装了一个名为dfsclient的hdfs客户端组件,负责对hdfs的实际数据进行读写访问。 |
1.2.2 hbase中的基本概念
基本概念 | 解释 |
---|---|
table | 表,一个表包含多行数据。 |
row | 行,一行数据包含一个唯一标识rowkey、多个column以及对应的值。在hbase中,一张表中所有row都按照rowkey的字典序由小到大排序 |
column | 列,与关系型数据库中的列不同,hbase中的column由column family(列簇)以及qualif ier(列名)两部分组成,两者中间使用":"相连。比如contents:html,其中contents为列簇,html为列簇下具体的一列。column family在表创建的时候需要指定,用户不能随意增减。一个column family下可以设置任意多个qualif ier,因此可以理解为hbase中的列可以动态增加,理论上甚至可以扩展到上百万列。 |
timestamp | 时间戳,每个cell在写入hbase的时候都会默认分配一个时间戳作为该cell的版本,当然,用户也可以在写入的时候自带时间戳。hbase支持多版本特性,即同一rowkey、column下可以有多个value存在,这些value使用timestamp作为版本号,版本越大,表示数据越新。 |
发表评论