在本文中的HBase术语:
基于列:column-oriented
行:row
列组:column families
列:column
单元:cell
理解HBase(一个开源的Google的BigTable实际应用)最大的困难是HBase的数据结构概念究竟是什么?首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.
Google's BigTable论文
清楚地解释了什么是BigTable:
Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是连续的byte数组.(A
Bigtable is a sparse, distributed, persistent multidimensional sorted
map. The map is indexed by a row key, column key, and a timestamp; each
value in the map is an uninterpreted array of bytes.)
Hadoop wiki的HBase架构
页面提到:
HBase使用和Bigtable非常相同的数据模型.用户存储数据行在一个表里.一个数据行拥有一个可选择的键和任意数量的列.表是疏松的存储的,因此
用户可以给行定义各种不同的列.(HBase uses a data model very similar to that of
Bigtable. Users store data rows in labelled tables. A data row has a
sortable key and an arbitrary number of columns. The table is stored
sparsely, so that rows in the same table can have crazily-varying
columns, if the user likes.)
实质上,HBase和BigTable是个map.相同于数组(PHP),词典(Pyhton),Hash(Ruby)或者Object
(Javascript)中的表现形式.所以每一行是一个map,这个map中还可以有多个map(基于列组).获取一个数据就像你从map中获取数据一
样.给定一个行名(即从这个map中获取数据),然后给定一个key(列组名+限定词)来取得数据.
HBase 和BigTable都是在分布式文件系统上构建的,所以基础的文件存储能够散布在分布式文件系统的机器上.
HBase使用Hadoop's Distributed File System(HDFS) 或 Amazon's Simple Storage
Service(S3),Kosmos Distributed File System(KFS), 与此一样BigTable使用Google
File System(GFS).数据被复制到多个节点就像数据被存储在一个RAID系统上.
不像大多数的map应用,在HBase和BigTable中,key/value
是非常严格地按字母次序排列的.那就是意味着键值为"aaaaa"的行下一个行的键值为"aaaab",但是和键值为"zzzzz"的行离的很远.因为这
些系统都是非常庞大和分布式的, 这些特性是非常重要的. 空间接近的列保证当你确定要浏览表时,
你感兴趣的行将会靠近这行.当你选择行的键值时,这是非常重要的事情.例子:考虑你表中的列是域名.最好是倒过来的(因此
"com.jimbojw.www"比"www.jimbojw.com"更好)
,因为你的子域名将会靠近你的主域名.注意在HBase中排序仅仅是kay排序,value是不排序的.
在下面的JSON数据中,我们看到整个数据结构是一个map,并且map中每一个key对应一个包含
"A"和"B"的map.假设整个下面数据是一个table,那么它有"1"."aaaaa","aaaab","xyz","zzzzz"这几个行,每
一个行有一个"A"和"B"的map.在HBase的术语中, 称"A"和"B"为列组.
{
"1" : {
"A" : "x",
"B" : "z"
},
"aaaaa" : {
"A" : "y",
"B" : "w"
},
"aaaab" : {
"A" : "world",
"B" : "ocean"
},
"xyz" : {
"A" : "hello",
"B" : "there"
},
"zzzzz" : {
"A" : "woot",
"B" : "1337"
}
}
在HBase中一个列组通过限定词或叫做标签使每一个列组能够包含许多的列.
{
"aaaaa" : {
"A" : {
"foo" : "y",
"bar" : "d"
},
"B" : {
"" : "w"
}
},
"aaaab" : {
"A" : {
"foo" : "world",
"bar" : "domination"
},
"B" : {
"" : "ocean"
}
},
"zzzzz" : {
"A" : {
"catch_phrase" : "woot",
}
"B" : {
"" : "1337"
}
}
}
在上面的例子中,在"aaaaa"的行中,列组"A"包含两个列:"foo"和"bar",列组"B"仅仅有一个限定词为空字符窜""的列.当我们
向HBase获取数据时,你必须提供完整的列名字"<列组>:<限定词>".因此上面的例子中行"aaaaa"和"aaaab"
都包含三个列:"A:foo",
"A:bar"和"B:".尽管在行中列组是固定的,但是同一个列中限定词可以是不同的,就像行"zzzzz"中列组"A"中只有一个列
"catch_phrase".最后的维度是时间戳(timestamp).所有的在HBase中存储的数据都有一个用时间戳表示的版本或者你自己通过指
定时间戳来插入或获取数据.
{
"aaaaa" : {
"A" : {
"foo" : {
15 : "y",
4 : "m"
},
"bar" : {
15 : "d",
}
},
"B" : {
"" : {
6 : "w"
3 : "o"
1 : "w"
}
}
}
}
每一个列可以指定多少版本的数据被保存在每一个单元.在上面的例子中行"aaaaa"的列"A:foo"包含两个倒序时间戳排列的数据15和4,列
"B"包含由三个倒序时间戳排列的数据.一般的应用程序只是简单(不通过时间戳)的请求一个单元的数据.在这种条件下,HBase只是简单地返回最新的版
本,即时间戳最大的版本.要获取"A:foo"返回"y",要获取"B"返回"w".如果应用程序在一个行中请求时带上时间戳,HBase将会返回小于或
等于请求时间戳的数据.接着上面的例子如果程序请求"A:foo"带上时间戳10,返回"m",加上时间戳3,返回null.
每一个行可以多个列族,每一个列族可以包含无数个列,每一个列都可以有一个不同于其他列的时间戳.在通用数据库中当表创建时我们就已经定义了列,如果修改表结构的话会非常困难(比如:添加一列).在HBase中我们可以很轻松地添加一个列族或列.
HBase性能选项:
就像在关系数据库中一样这个列是使用CHAR,VARCHAR或者TEXT一样会影响数据存储和性能一样,HBase性能选项也同样影响着
HBase的性能.在HBase中所有的列在同一个列组中拥有同样的MAX_VERSIONS,MAX_LENGTH,COMPRESSION,
IN_MEMORY和BLOOMFILTER特性.
HBase使用Hadoop的MapFile来存储数据和索引,MapFile调用SequenceFile写数据,SequenceFile
可以让你选择如何压缩数据.MapFile的索引文件是采用BLOCK压缩的.数据文件取决于你的设置,在HBase中默认是对列组中的数据不压缩的,但是有两个选项可以让这个列组中的数据压缩:BLOCK和RECORD.
Block压缩,假定你有单独的列包含大块的数据并且你只想保存一个版本的数据.在这种情况下,你可能让这个列组支持Block压缩.因为这种压缩选项为了取得更好的压缩比率压缩多列数据.
RECORD压缩,假定你拥有许多行包含数据,并且每一个列你想要保存多个版本.你可能让这个列组支持RECORD压缩,因为这种压缩会让每一个列的数据连续地在一起.
尽管压缩比率BLOCK压缩比RECORD压缩要更好一些,但是在理论上RECORD压缩的访问时间要更快,因为不需要解压key(HStoreKey)而只是解压value这部分数据.
如果这个列组支持布隆过滤器(BLOOMFILTER),那么在内存中有个索引来快速地判断要查找的列是否存在这个行中,减少磁盘IO操作.如果在这个列组你拥有大量的列,每一个列的数据包含的数据非常小,你可能需要在这个列组中应用布隆过滤器。HBase中Bloom Filter的使用
已经非常清楚地描述描述了布隆过滤器的用法和容错率算法.
IN_MEMORY特性选项,
如果这个列组装载数据到内存,我们将的到将会加快读写的优势.磁盘的读写和内存的读写当然没法相比.劣势是所有的数据装载在内存将会花费我们的内存,还会干预HDFS的备份,因为数据会比往常更少次数往磁盘的写入.
MAX_LENGTH and MAX_VERSIONS列组特性从总体性能来看是非常重要的,但是很少影响实际的功能.实际上上面这两个特性控制每一个单元保存多少版本的数据(默认是3)和每个单元中的版本能够保存多少字节的数据(默认是32位有符号整形).
本文基本上从下面网址翻译并加上我自己组织的一些段落,希望能够对大家有所帮助:
Understanding HBase and BigTable
Understanding HBase column-family performance options
原文地址:本人维护的站点http://www.hadoop.org.cn/hadoop/explain-hbase-with-performance-options/
分享到:
相关推荐
HBase写性能优化策略HBase写性能优化策略HBase写性能优化策略
里面包括了特定场合下,HBase随机查询的一些性能指标参考以及调优策略
HBase性能深度分析HBase性能深度分析
hbase性能报告
Hbase 性能 优化,Hbase 数据查询 插入参考
某大数据公司内部Hbase性能测试详细设计文档及用例 罗列了Hbase性能测试需要注意的一些参数设置,给出了Hbase测试用例
HBase在不同版本(1.x, 2.x, 3.0)中针对不同类型的硬件(以IO为例,HDD/SATA-SSD/PCIe-SSD/Cloud)和场景(single/batch, get/scan)做了(即将做)各种不同的优化,这些优化都有哪些?如何针对自己的生产业务和...
HBase的性能优化测试,应各自环境不同参照设置自己的数据库参数
真的是实战经验才能得出来的结果,如果你想深入了解hbase的性能,这个真的对你会有很大的帮助
本资源为hbase的安装和使用,内含hbase安装工具包,hbase的安装说明,hbase的使用说明 。
HBase最佳实践-读性能优化策略,HBase最佳实践-读性能优化策略
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
hbase备份和数据恢复,hbase与hive的互导,hbase和hdfs互导。
HBase最佳实践-读性能优化策略-3——HBase服务器端优化.pdf 学习资料 复习资料 教学资源
hbase原理和设计,包括二级索引,rowkey设计,常见的坑.
HBase的模式Schema设计的一些概念和原则 5 1)模式的创建与更新 5 2)列族的数量 6 3)行键设计RowKey 6 5. HBase的拓扑结构是什么? 7 1)拓扑结构 7 2)HBase与ZooKeeper的关系是什么? 7 3)HBase的内部结构管理...
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...