HBase
-
Hadoop Database
,是一个高可靠性、高性能、面向列、可伸缩、
可
实时读写的
分布式数据库
,
利用
Hadoop HDFS
作为其文件存储系统
,
利用
Hadoop MapReduce
来处理
HBase
中的海量数据
,
利用
Zookeeper
作为其分布式协同服务
,
主要用来存储非结构化和
半结构化的松散数据(列存
NoSQL
数据库)
。
列式数据库
列式数据库是以列相关存储架构进
行数据存储的数据库,主要适合与批量数据处理和
即席查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适
合与小批量的数据处理,常用于联机事务型数据处理。
列式数据库以行、列的二维表的形式存储数据,但是却以一维字符串的方式存储,例
如以下的一个表:
EmpId
Lastname
Firstname
Salary
1
Smith
Joe
40000
2
Jones
Mary
50000
3
Johnson
Cathy
44000
这个简单的表包括员工代码
(EmpId),
姓名字段
(L
astname and Firstname)
及工资
(Salary).
这个表存储在电脑的内存
(RAM)
和存储
(
硬盘
)
中。虽然内存和硬盘在机制上不同,电
脑的操作系统是以同样的方式存储的。数据库必须把这个二维表存储在一系列一维的“字
节”中,操作系统把它们写到内存或硬盘中。
行式数据库把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推。
1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;
列式数据库把一列中的数据值串在一起存储起来
,然后再存储下一列的数据,以此类推。
1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;
HBase
数据模型
在
HBase
中,数据是存储在有行有列的表格中。这是与关系型数据库重复的术语,但不能
做类比。相反,
HBase
可以被认为是一个多维度的映射。
HBase
数据模型术语
Table
(表格)
一个
HBase
表格由多行组成。
Row
(行)
HBase
中的行里面包含一个
key
和一个或者多个包含值的列。行按照行的
key
字母顺
序
存储在表格中。
Row key
只能存储
64k
的字节数据
。因为这个原因,行的
key
的设计就显
得非常重要。数据的存储目标是相近的数据存储到一起。一个常用的行的
key
的格式是网
站域名。如果你的行的
key
是域名,你应该将域名进行反转
(org.apache.www,
org.apache.mail, org.apache.jira)
再存储。这样的话,所有
Apache
域名将会存储在一起,好
过基于子域名的首字母分散在各处。
Column
(列)
HBase
中的列包含用:分隔开的列族和列的限定符。
Column Family
(列族)
因
为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储
属性,例如值是否缓存在内存中,数据是否要压缩或者他的行
key
是否要加密等等。表格
中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族
中。
Column Qualifier
(列的限定符)
列的限定符是列族中数据的索引。例如给定了一个列族
content
,那么限定符可能是
content:html
,也可以是
content:pdf
。列族在创建表格时是确定的了,但是列的限定符是动
态地并且行与行之间的差别也可能是非常大的。
HBase
表中的每个列都归属于某个列族,列族必须作为表模式
(schema)
定义的一部分预
先给出。如
create
'
test
'
,
'
course
'
;
列名以列族作为前缀,每个“列族”都可以有多个列成员
(column)
;如
course:math,
course:english
,
新的列族成员(列)可以随后按需、动态加入;
权限控制、存储以及调优都是在列族层面进行的;
HBase
把同一列族里面的数据存储在同一目录下,由几个文件保存。
Cell
(单元)
由行和列的坐标交叉决定;
单元格是有版本的;
单元格的内容
是未解析的字节数组;
单元
格
是由行、列族、列限定符、值和代表值版本的时间戳组成的
(
{row key
,
column( =<family> +<qualifier>)
,
version}
)唯一确定
单元
格
。
cell
中的数据是没有类型
的,全部是字节码形式存储。
Timestamp
(时间戳)
时间戳是写在值旁边的一个用于区分值的版本的数据。默认情况下,时间戳表示的是
当数据写入时
RegionSever
的时间点,但你也可以在写入数据时指定一个不同的时间戳。
在
HBase
每个
cell
存储单元对同一份数据有多个版本,根
据唯一的时间戳来区分每个
版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
时间戳的类型是
64
位整型。时间戳可以由
HBase(
在数据写入时自动
)
赋值,此时时间
戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值,如果应用程序要避免数
据版本冲突,就必须自己生成具有唯一性的时间戳。
概念视图
例子
:
一个名为
webable
的表格,表格中有两行(
com.cnn.www
和
com.example.www
)和
三个列族(
contents, anchor
和
people
)。在这个例子当中,第一
行
(com.cnn.www)
中
anchor
包含两列(
anchor:cssnsi.com, anchor:my.look.ca
)和
content
包含一列
(
contents:html
)。这个例子中
com.cnn.www
拥有
5
个版本而
com.example.www
有一个版
本。
contents:html
列中包含给定网页的整个
HTML
。
anchor
限定符包含能够表示行的站点
以及链接中文本。
People
列族表示跟站点有关的人。
Table 4. Table webtable
Row Key
Time Stamp
ColumnFamily
contents
ColumnFamily
anchor
ColumnFamily
people
列名
按照所定义好的,一个列名的格式为列族名前缀加限定符。例如,
列
contents:html
由列族
contents
和
html
限定符。冒号(
:
)用于将
列族和列限定符分开。
"com.cnn.www"
t9
anchor:cnnsi.com
= "CNN"
"com.cnn.www"
t8
anchor:my.look.ca
= "CNN.com"
"com.cnn.w
ww"
t6
contents:html =
"<html>...
"
"com.cnn.www"
t5
contents:html =
"<html>...
"
"com.cnn.www"
t3
contents:html =
"<html>...
"
com.example.www
t5
contents:html =
"<html>...
"
people:author:
=
"John Doe"
在
HBase
中,表格中的单元如果是空将不占用空间或者事实上不存在。这就使得
HBase
看起来“
稀疏”。表格视图不是唯一方式来查看
HBase
中数据,甚至不是最精确
的。下面的方式以多维度映射的方式来表达相同的信息。
{
"com.cnn.www": {
contents: {
t6: contents:html: "<html>..."
t5: contents:html: "<html>..."
t3: contents:html: "<html>..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.
ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "<html>..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}
物理视图
尽管一个概念层次的表格可能看起来是由一些列稀疏的行组成,但他们是通过列族来
存储的。一个新建的限定符
(colu
mn_family:column_qualifier)
可以随时地添加到已存在的列
族中。
Table 5. ColumnFamily anchor
Row Key
Time Stamp
ColumnFamily anchor
"com.cnn.www"
t9
anchor:cnnsi.com = "CNN"
"com.cnn.www"
t8
anchor:my.look.ca = "CNN.com"
Table 6. ColumnFamily contents
Row Key
Time Sta
mp
ColumnFamily
contents
"com.cnn.www"
t6
contents:html = "<html>...
"
"com.cnn.www"
t5
contents:html = "<html>...
"
"com.cnn.www"
t3
contents:html = "<html>...
"
概念视图中的空单元实际上是没有进行存储的。因此对于返回时间戳为
t8
的
contents:html
的值的请求,结果为空。同样的,一个返回时间戳为
t9
的
anchor:my.look.ca
的值的请
求,结果也为空。然而,如果没有指定时间戳的话,那么会返回特定列的最新
值。对有多个版本的列,优先返回最新的值,因为时间戳是按照递减顺序存储的。因此对
于一个返回
com.cnn.www
里面所有的列的值并且没有指定时间戳的请求,返回的结果会是
时间戳为
t6
的
contents:html
的值、时间戳
t9
的
anchor:cnnsi.com f
的值和时间戳
t8
的
anchor:my.look.ca
。