【十八掌●武功篇】第八掌:HBase之基本概念

这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:这里写图片描述大数据技术●降龙十八掌


系列文章:
:【十八掌●武功篇】第八掌:HBase之基本概念
【十八掌●武功篇】第八掌:HBase之Shell
【十八掌●武功篇】第八掌:HBase之基本操作Java API
【十八掌●武功篇】第八掌:HBase之过滤器总结
【十八掌●武功篇】第八掌:HBase之性能调优
【十八掌●武功篇】第八掌:HBase之安装与集成 [草稿]

第一部分: HBase概述

一、 官网定义

Apache HBase is the Hadoop database, a distributed, scalable, big data store.

HBase是Hadoop生态系统中的一个分布式、可扩展、面向列、可伸缩、具有自动容错的大数据数据库。
● 分布式:HBase是集群方式运行的,HBase集群由一个Master节点和多个RegionServer节点组成,并由Zookeeper进行管理。
● 可扩展:HBase的数据存储是基于HDFS的,本身就可扩展的。
● 面向列:HBase是按列拆分为多个独立的集合进行存储的,按列存储利于压缩,减少存储空间, 并避免了读取冗余列,提高了查询的效率,缺点是不如行存储写入速度那么高,但是面向列存储更适合于大数据数据库。
● 可伸缩:可伸缩性讲究平滑线性的性能提升,HBase对数据的处理能力上是可以伸缩的,是指随着数据量的增长处理时间是同步线性增长的,并没有出现当数据量很大时造成处理时间的急剧增加现象
● 自动容错:HBase的自动容错体现在很多方面:Master自动容错、RegionServer自动容错、HDFS的自动容错。

二、 HBase的应用场景

应用于对大数据进行实时、随机查询的场景,这个大数据可以是数十亿行、数百万列的数据。但是HBase的局限在于HBase表的设计必须是依赖于查询条件的,是根据业务的查询条件来设计HBase表。

三、 存储和执行

HBase里的数据是存储在HDFS中的,是通过MapReduce来执行数据分析。

四、 HBase的框架特性

1、 线性与模块化扩展,体现了HBase的可伸缩性和扩展性。
2、 读写严格一致
3、 表可以自动或者通过配置进行切分
4、 数据读写节点服务器支持自动失效检测
5、 基于MapReduce方便对表进行数据处理
6、 方便使用Java API做为客户端进行过滤访问
7、 支持多客户端访问方式:Thrift、REST-ful。
8、 基于JRuby实现的Shell交互式操作界面
9、 可通过Ganglia或者JMX进行集群监控

五、 HBase表的特性

1、 大,一个表可以有几十亿行,百万列。数十亿行数百万列数千个版本=TB或者PB级别。
2、 模式自由:每行有一个可排序的主键和任意多的列,列可以动态增加,同一个表中的不同行可以有不同的列。
3、 面向列存储的。
4、 空null并不占用空间,数据在HBase都是以二进制数组进行存储的。
5、 数据有多个版本,每个单元格有多个不同的版本,版本号用时间戳自动分配,单元格中数据的更新都是新增新的版本的数据。
6、 数据类型单一,都是以字节数组存储的。

六、 HBase与HDFS比较
HDFSHBase
为分布式存储提供文件系统提供表状的面向列的数据存储
不支持随机读写,对存储大文件进行优化对表状数据进行随机读写进行优化
直接读取文件使用键值对类型数据
数据模型不灵活提供灵活的数据模型
使用文件系统和处理框架使用表状数据,依赖内置的MapReduce支持
为一次写多次读进行优化为多次读写进行优化
七、 HBase与RDBMS比较
关系型数据库HBase
支持向上扩展(升级硬件)支持向外扩展(增加服务器)
使用SQL查询从表中读取数据使用API和MapReduce来读写数据
面向行存储面向列存储
数据总量依赖于数据库的配置数据总量取决于服务器的个数
模式更严格模式灵活,不严格
具有ACID支持没有內建的对HBase的支持
适合结构化数据适合结构化数据和
一般是中心化的是分布式的
一般能保证事务的完整性HBase不支持事务
支持Join不支持Join
支持参照完整性没有内置的参照完整性支持

第二部分: HBase的组成部分

一、 架构图

这里写图片描述

二、 Master作用

1、 为RegionServer分配Region
Region可以看做是HBase表的分区,HBase表数据根据RowKey进行划分后,分布在不同的Region上。
2、 负责RegionServer的负载均衡
3、 发现失效的RegionServer并重新分配其上的Region
4、 管理用户对HBase表的增删改查操作

三、 Region

Region是HBase的最小负载均衡的单元,HBase表数据会分布在一个或者多个Region上。默认情况下创建表时只有一个Region,默认是256M大小,当数据慢慢增多后,Region会自动切分,平均分为两个Region。

四、 RegionServer

1、 维护其所包括的Region,处理对这些Region的IO请求。
2、 负责切分运行中变的过大的Region。

五、 Zookeeper

1、 保证HBase集群中只有一个Master在工作。
Master和RegionServer启动时会自动向Zookeeper注册。
2、 存储所有Region的寻址入口。
HBase中有一个hbase:meta系统表,记录了HBase集群中有哪些表、表有哪些Region、Region在哪些RegionServer上、Region包含哪些Rowkey(起始RowKey、截止RowKey)这些信息。
Zookeeper上存储了hbase:meta表在哪些Region上,在哪些RegionServer上,RowRegion包含哪些RowKey。
3、 实时监控RegionServer的上线、下线信息,并实时通知Master。
4、 存储HBase的Schema和Table元数据。
5、 Zookeeper上关于HBase的ZK节点

[zk: localhost:2181(CONNECTED) 7]  ls /hbase
[meta-region-server, backup-masters, draining, table, region-in-transition, table-lock, running, namespace, hbaseid, online-snapshot, replication, recovering-regions, splitWAL, rs]

(1) meta-region-server:存储的是hbase:mate表的元数据。
(2) backup-masters:存储备份Master的信息,因为有可能有多个backup-master,所以可能有多个子节点。
(3) draining:记录哪些RegionSever下线了。
(4) table:存储HBase上表的信息,存储有哪些表。
(5) region-in-transition:控制事务的。
(6) table-lock:表锁信息,HBase只有行锁。
(7) running:正在运行的一些信息。
(8) master:master节点的信息。
(9) namespace:表的命名空间的信息,默认是default命名空间,系统的命名空间是hbase。
如hbase:meta中,hbase是命名空间的名字。
(10) hbaseid:hbase的编号。
(11) online-snapshot:
(12) replicateion
(13) recovering-regions
(14) splitWAL
(15) rs:储存regionServer节点的信息,RegionSever启动时会在Zookeeper上的注册。

六、 Client

包含访问HBase的接口,并维护Cache来加快HBase的访问,比如Region的位置信息。

七、 hbase:meta表

hbase:meta表中存储的是HBase中表Regin的信息,查看hbase:meta表中数据的命令如下:
hbase(main):005:0> scan ‘hbase:meta’ , {LIMIT=>100}
表中rowkey格式为:test,,1481541882182.b46f1de4ea1a909e
test为表名;第二个为开始的Rowkey,带三部分是时间戳,最后为对前面的md5。

第三部分: HBase表的逻辑结构

八、 表的组成结构

1、 表结构示意图

这里写图片描述

2、 表名
类似于关系型数据库的表。
3、 RowKey
类似于关系型数据库中的主键,RowKey是HBase表中数据的唯一标示,是按照字典顺序排序的,最多存储64K数据。
4、 列族
必须是在创建表时要定义好列族,也可以动态添加列族,列族不能太多,一般是一两个。
在物理上同一行同一个列族下的所有内容存储在一起。
5、 列标签
一个列族下,是由列标签和Value值组成的键值对组成的,插入数据时是可以任意指定列标签的,但是实际应用时,是要根据业务来定义列表标签。
6、 单元格
单元格是存储数据的最小单位,是由表名、rowkey、列族、列标签确定一个单元格的,一个单元格上多个版本,每一个版本有一个值,同一个单元格上,可以有多个版本的数据。
7、 时间戳
时间戳是单元格上的版本号。

九、 HBase的更新

因为HBase实际上是存储在HDFS上的,由于HDFS上的数据是不能进行更改的。
HBase的更新是在单元格上新增一个版本。

第四部分: HBase数据读写流程

十、 读HBase数据过程

1、 客户端连接Zookeeper,从ZK节点,/hbase/meta-region-server节点上获取关于hbase:meta表的信息。
2、 根据hbase:meta表的元数据找存储hbase:meta表数据的到RegionServer,读取数据。
3、 从hbase:meta表中读取目标表的元数据,根据元数据去读取对应Region上的数据。
4、 写缓存:blockcache

十一、 HBase写数据过程

下面以客户端向HBase中test表里写一条数据为例,说明写入数据的过程:
1、 客户端首先读取Zookeeper节点,获取hbase:meta表所在Region信息
2、 根据Regin信息找到hbase:meta表的位置,读取hbase:meta表里的数据。
3、 从hbase:meta表里读取到test表所有的Region信息,再根据RowKey确定插入哪个Region中。
4、 Region内部会根据列族划分出Store,每个Store中会有一个memstore和零个或者多个storefile。memstore是一块内存空间,默认是128M,达到最大空间后,就会刷写到磁盘,生成一个storefile。memstore是滚动刷写的,即当memstore满后就会生成一块新的memstore用来接收新的写入,老的memstore用来进行刷写磁盘,这样避免阻塞提高效率。
一个storefile是一个HFile。
5、 当插入memstore之前会有一个WAL(预写日志)机制,就是先将数据写入一个日志文件Hlog中,这个文件是顺序写的,然后再写入memstore,这样避免了memstore没有刷写到前宕机造成数据丢失的问题。如果宕机,可以从HLog中再次重生数据。HLog也是DataNode上的一个文件,有多个备份。
6、 当memstore中的数据刷写到磁盘后,HLog中的数据也会随着删除。

第五部分: RowKey设计

1、 唯一性
rowkey是HBase表中的唯一标识,所以必须唯一。
2、 长度尽量短,最长不能超过64KB。
每一行都有一个rowkey, HBase表中的数据往往很大,但是rowkey是与业务信息无关的数据,如果rowkey设计的很长,那就会占用很大的硬盘资源,造成资源巨大的浪费。所以应该在能满足需求的基础上,rowkey设计的尽量的短。
3、 写入散列、读取连续原则
HBase是根据rowkey进行分配Region的,相近的rowkey会分配到同一个region上,rowkey设计的散列,更利于在各个Region上平均分配,不会导致数据在某一时刻集中存储到某一两个Region上,造成这几个Region压力过大。
4、 尽可能将查询字段放入rowkey
因为HBase根据rowkey查询速度是最快的,所以要尽量将查询字段放入rowkey中。


这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:这里写图片描述大数据技术●降龙十八掌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值