HBase 简介

 
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
posted @ 2018-04-17 10:08  高登军  阅读(337)  评论(0编辑  收藏  举报