HBase 是Hadoop一个分布式,可扩展的大数据存储的数据库。特点是可以对大数据进行随机,实时的读/写访问。
其实HBase的来源可以追溯到一篇论文"Bigtable: A Distributed Storage System for Structured Data"有兴趣同学可以去看看这篇文章。
HBase是NoSQL,整个HBase可以简单看作一个‘Bigtable’。说到分布式存储,就可以说它是将大表拆分来存储。如下图1一张表,拆分为6部分来存储。但是HBase可不是随意拆分的,是按照列簇和行键(row key)来切分表的。
先介绍一些概念,然后我们再回头来细说上图1。
(1)Name Space
命名空间,类似关系型数据库的database的概念。命名空间下可以有很多张表,HBase有两个自带的命名空间,分别为hbase和default,hbase存放的是HBase内置的表,default表示用户默认使用的命名空间。
hbase(main):001:0 > list_namespace
(2)Region
类似关系型数据库的表的概念,不同点是,HBase定义表的时候只需要声明列簇就好,不需要声明具体的列。所以往HBase写入数据,字段可以按需,动态指定。
#create '表名', '列簇1', '列簇2'...
hbase(main):001:1 > create 'person','personal_info', 'office_info'
# 插入数据 put '表名','rowkey','列簇名:列名','值'
hbase(main):001:2 > put 'person','0001','personal_info:name', '张三'
(3)Row
HBase表的每一行由RowKey和多个列数据组成,数据按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey检索,RowKey的设计很重要。
(4)Column
HBase表的每一列都由列簇和列限定符进行限定,例如:personal_info:name,office_info:tel。建表的时候只需声明列簇就好,而列限定符无需预先定义。
(5)Time Stamp
时间戳,用于标识数据的不同版本,每一条数据写入时,若不指明具体时间戳,系统会自动为其加上这个字段,其值为写入HBase时当前系统的时间。
(6)Cell
由{rowkey,column Family : column Qualifier,time Stamp}({行建,列簇:列限定符,时间戳})唯一确定的单元。cell中数据没有类型,全以字节码形式存储。
回头看图1,从图中可以看得出
- 列簇:personal_info,office_info
- RowKey:row_key1,row_key11,row_key2....,row_key7,每个row_key所在行就是一条行(row)数据。
- Region:虽然这个表分6块存储,但是region是包含完整的行数据的。如图中row_key3,row_key4,row_key5的数据。
- Store:表示实际存储在集群的数据,列簇和列限定符是元数据信息,一般存储在内存。
HBase的逻辑存储就是图1所示的存储方式,接下来看看HBase的物理存储,即针对某一条数据怎么存储的。
就拿personal_info这个列簇来说,row_key1的数据在HBase是如上图中下方表格所示,其中每个行就是一个cell。因为是row_key1的数据,所以他们的RowKey都是row_key1;column Family是列簇,都是属于personal_info这个列簇;column Qualifier是列限定符,分别是列簇中的列名;Time Stamp是时间戳,就是对其操作的时间;type是代表操作的方式:put(包括添加,修改),delete(删除);value是操作后的值。上图可以看到有两条对列"phone"的操作,但value不一样,这时候就根据TimeStamp的先后来判定它的值,它的值为最近时间操作的那个值。
(文中插图1和图2为某个视频的截图,个人认为这两个图很有代表性就拿过来用了,若存在侵权,请告知作者,谢谢!)
作者最近在学习大数据相关的技术知识,所以就分享一些自己的学习笔记,希望和大家一起讨论,一起进步!!