上网Google了下什么是HBase,下面说一下,我的初步的理解。
u 基本概念:
什么是HBase?
HBase(Hadoop Database): 首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。
数据模型?
数据模型类似于Google的BigTable.Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是连续的byte数组
HBase使用和Bigtable非常相同的数据模型.用户存储数据行在一个表里.一个数据行拥有一个可选择的键和任意数量的列.表是疏松的存储的,因此用户可以给行定义各种不同的列.
实质上,HBase和BigTable是个map.相同于数组(PHP),词典(Pyhton),Hash(Ruby)或者Object
(Javascript)中的表现形式.
所以每一行是一个map,这个map中还可以有多个map(基于列组).获取一个数据就像你从map中获取数据一样.给定一个行名(即从这个map中获取数据),然后给定一个key(列组名+限定词)来取得数据.
u 一个例子:
下面我们来看个例子:
HBase是在分布式文件系统上构建的,所以他的数据存贮方式是以文件来存放的。
如下表格的数据:
编号 |
姓名 |
年龄 |
身高 |
1 |
Tony wa |
11 |
112 |
2 |
Jason He |
12 |
132 |
我们以Jaon格式的数据来表达,是下面的样子 (这里说明了什么是行键)
结构化的表达方式 |
HBase的表达方式 |
说明 |
学员信息{
{
“编号”,”1”,
“姓名”:”Tony wa”,
“年龄”:”11”,
“身高”:”112”
},
{
“编号”,”2”,
“姓名”:”Jason He”,
“年龄”:”12”,
“身高”:”132”
} |
学员信息{
“1”: {
“姓名”:”Tony wa”,
“年龄”:”11”,
“身高”:”112”
},
“2”:{
“姓名”:”Jason He”,
“年龄”:”12”,
“身高”:”132”
} |
HBase的Jason格式中,我们看到整个数据结构是一个map,并且map中每一个key对应一个包含
”姓名”,
”年龄”,
”身高”
的map.
在这个map中有”1”,”2”两行数据。
用编号作为了行的Key(或者行名),每个Key对应一个包含”姓名”,”年龄”,”身高”的map.
在Hbase的术语中,我们称”姓名”,”年龄”,”身高”为列组。 |
如果我们需要增加两列数据如下:
编号 |
姓名 |
年龄 |
身高 |
体重 |
近视 |
1 |
Tony wa |
11 |
112 |
34 |
是 |
2 |
Jason He |
12 |
132 |
50 |
N/A |
传统的方法是增加两列,我们看一下Hbase是如何处理的。
我们以Jaon格式的数据来表达,是下面的样子(这里说明了什么是列键)
结构化的表达方式 |
HBase的表达方式 |
说明 |
学员信息{
{
“编号”,”1”
“姓名”:”Tony wa”
“年龄”:”11”
“身高”:”112”
“体重”:”34
“近视”:”是”
}
{
“编号”,”2”
“姓名”:”Jason He”
“年龄”:”12”
“身高”:”132”
“体重”:”50
“近视”:”N/A
} |
学员信息{
“1”: {
“姓名”:”Tony wa”
“年龄”: {
“” : ”12”
}
“身体情况” : {
“身高:”112
“体重:”34
“近视:”是
}
}
“2”:{
“姓名”:”Jason He”
“年龄”:{
“” : ”12”
}
“身体情况” : {
“身高:”132
“体重:”50
}
} |
在HBase中一个列组通过限定词或叫做标签使每一个列组能够包含许多的列。 在这个例子中,列组"身体情况"包含三个列: "身高" "体重" “近视”, 列组"年龄"仅仅有一个限定词为空字符窜""的列 当我们向HBase获取数据时,你必须提供完整的列名字"<列组>:<限定词>". 因此上面的例子中行"1"和"2"都包含四个列: "姓名:", "年龄:", "身体情况:身高", "身体情况:体重" 在行中列组是固定的,但是同一个列中限定词可以是不同的,就像行" 2"中列组"身体情况"中只有二个列。(没有”近视”列) 注意:对于学员Jason he由于不需要近视情况,所以也不需要保存 一个空信息,这点不像SQL server必需保存一个空信息。 |
最后的维度是时间戳(timestamp).所有的在HBase中存储的数据都有一个用时间戳表示的版本或者你自己通过指定时间戳来插入或获取数据。
还是以上面的例子来说明,(对于传统方式,如果要加时间戳的话,要相应的增加行这里我就不写了,只说明HBASE的表达方法。(这里说明了什么是时间戳)
结构化的表达方式 |
HBase的表达方式 |
说明 |
学员信息{
{
“编号”,”1”
“姓名”:”Tony wa”
“年龄”:”11”
“身高”:”112”
“体重”:”34
“近视”:”是”
}
{
“编号”,”2”
“姓名”:”Jason He”
“年龄”:”12”
“身高”:”132”
“体重”:”50
“近视”:”N/A
} |
学员信息{
“1”: {
“姓名”:”Tony wa”
“年龄”: {
“” : ”12”
}
“身体情况” : {
“身高:” {
10: 112,
8: 110,
5: 108
},
“体重:”34
“近视:”是
}
}
“2”:{
“姓名”:”Jason He”
“年龄”:{
“” : ”12”
}
“身体情况” : {
“身高:”132
“体重:”50
}
} |
每一个列可以指定多少版本的数据被保存在每一个单元.在上面的例子中行"1"的列
"身体情况:身高", 包含三个倒序时间戳排列的数据10,8和5. 一般的应用程序只是简单(不通过时间戳)的请求一个单元的数据.在这种条件下,HBase只是简单地返回最新的版本,即时间戳最大的版本.要获取"身体情况:身高":"返回"112".如果应用程序在一个行中请求时带上时间戳,HBase将会返回小于或等于请求时间戳的数据.接着上面的例子如果程序请求"身体情况:身高"带上时间戳10,返回"112",加上时间戳5,返回110,加上时间戳3,返回null
|
总结:
HBase中,每一个行可以多个列族,每一个列族可以包含无数个列,每一个列都可以有一个不同于其他列的时间戳.
行中列组是固定的,但是同一个列中限定词可以是不同的。
在通用数据库中当表创建时我们就已经定义了列,如果修改表结构的话会非常困难(比如:添加一列).在HBase中我们可以很轻松地添加一个列族或列.
下面我们以表格方式说明对比传统的结构化存贮和HBase的非结构化存贮的不同
结构化的表达方式 |
学员表 |
编号 |
姓名 |
年龄 |
身高 |
体重 |
近视 |
1 |
Tony wa |
11 |
112 |
34 |
是 |
2 |
Jason He |
12 |
132 |
50 |
否 |
|
HBase的表达方式 |
|
记住:行中列组是固定的,但是同一个列中限定词可以是不同的。 |
|