就今天吧,稀里糊涂的,入门学习个HBase!就记些比较重要的、需要重点掌握的知识点吧。别问为什么,死记硬背就完事了!
一、HBase简介
HBase是什么?
Hbase是一种NoSQL数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。
HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可以使用HBase。
HBase的特点
- 大:一个表可以有上亿行,上百万列。
- 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
- 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
- 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
- 数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
- 数据类型单一:HBase中的数据都是字符串,没有类型。
二、数据模型
1、RowKey
RowKey 是一行记录的 主键 ,用于检索记录数据的。HBase的数据是按照RowKey的 字典顺序 进行全局排序的,所有的查询都只能依赖于这一个排序维度。访问 HBase table 中的行,只有三种方式:
通过单个 RowKey 访问。
通过 RowKey 的 range 全表扫描。
RowKey 可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10 ~ 100bytes),在HBase 内部,RowKey 保存为字节数组。
通过下面一个例子来说明一下” 字典排序 “的原理:
RowKey列表{“abc”, “a”, “bdf”, “cdf”, “def”}按字典排序后的结果为{“a”, “abc”, “bdf”, “cdf”, “defg”}
2、Row(行)
HBase表中的每行数据都是一个RowKey和 多个Column(列)组成,数据是按照RowKey的字典顺序存储的。
3、Column(列)
HBase每个列都由列族和列限定符进行限定,例如info:name , info : age。建表时,只需要指定列族,而列限定符无需预先定义。
4、Column Family(列族)
如果将Region看成是一个表的 横向切割 ,那么,一个Region中的数据列的 纵向切割 ,称之为一个 Column Family 。每一个列,都必须归属于一个Column Family,这个归属关系是在写数据时指定的,而不是建表时预先定义。
5、Cell
Cell 是由 {RowKey,ColumnFamily : Column Qualifier,TimeStamp} 唯一确定的单元。Cell 中的数据是没有类型的,全部是字节码形式存储。
6、Region
HBase中采用了”Range分区”,将Key的完整区间切割成一个个的”Key Range” ,每一个”Key Range”称之为一个Region。
也可以这么理解:将HBase中拥有数亿行的一个大表, 横向切割 成一个个” 子表 “,这一个个” 子表 “就是 Region 。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
当一个Region增长到一定大小以后,会自动分裂成两个。
每个region由以下信息标识:
- < 表名,startRowkey,创建时间>
- 由目录表(-ROOT-和.META.)记录该region的endRowkey
7、TimeStamp(时间戳)
HBase 中通过 Row 和 Columns 确定的一个存储单元称为 Cell。每个 Cell 都保存着同一份数据的多个版本。 版本通过时间戳来索引,时间戳的类型是 64 位整型。时间戳可以由HBase(在数据写入时自动)赋值,
此时时间戳是精确到毫秒的当前系统时间。时间戳也 可以由客户显示赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 Cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的管理(包括存储和索引)负担,HBase 提供了两种数据版本回收方式。 一是保存数据的最后 n 个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
8、稀疏矩阵
HBase中一个表的数据是按照稀疏矩阵的方式组织的,行与行之间也无须遵循一致的定义,而这种定义恰好符合半结构化数据或非结构化数据的特点。
HBase定义表是只需要声明 *列族 *即可,不需要声明具体的列,这意味着,往HBase写入数据时,字段可以 动态、按需 指定。
9、Store
每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region
注意
Hregion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。
HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。HRegion由一个或者多个Store组成,每个store保存一个columns family。每个Strore又由一个memStore和0至多个StoreFile组成。如图:
StoreFile以HFile格式保存在HDFS上。
三、HBase系统架构
Client
包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息。
Zookeeper
1 保证任何时候,集群中只有一个master
2 存贮所有Region的寻址入口。
3 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
4 存储Hbase的schema,包括有哪些table,每个table有哪些column family
RegionServer
1 Region server维护Master分配给它的region,处理对这些region的IO请求
2 Region server负责切分在运行过程中变得过大的region
Data: get,put,delete (HBase通过时间戳控制每条数据,get最新数据,put写入数据,若没有此条数据则代表插入,有则代表修改,delete删除数据)
Region:splitRegion(切片),compactRegion(合并)
Master(高可用)
1 为Region server分配region
2 负责region server的负载均衡
3 发现失效的region server并重新分配其上的region
4 GFS上的垃圾文件回收
5 处理schema更新请求
Table:create,alter,delete
RegionServer:分配region给每个regionServer,监控每个regionServer的状态
RegionServer管理着Region,对数据的操作,DML。
Master管理表的增删改查,以及Region的维护信息,DDL。
总结
可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。