HBase的概念和性能选项

在本文中的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

时间: 2024-09-20 05:32:00

HBase的概念和性能选项的相关文章

win7开机总是弹出性能选项怎么办

  win7开机总是弹出性能选项怎么办 首先右键点击桌面上的计算机图标,打开属性. 接着点击系统属性窗口中的高级系统设置. 切换到高级标签,点击设置. 在新窗口中继续点击高级,点击虚拟内存中的更改. 勾选自动管理所有驱动器的分页文件大小,重启电脑即可解决问题.

DedeCMS系统设置说明:性能选项

(是/否)开启分页标题,开启会影响HTML生成速度(cfg_arcsptitle):如果开启了这个函数,将启用分页标题,我们在发布普通文章的时候会在编辑器看到添加"#p#副标题#e#"这个代码,开启后分页标题的功能才可以使用,不过需要在模板中加入{dede:pagetitle style='select'/}标签 (是/否)开启长文章自动分页(cfg_arcautosp):开启后,系统自动判断内容大小进行自动分页,系统默认是关闭的 文章自动分页大小(单位:K)(cfg_arcautos

HBase BlockCache系列 - 性能对比测试报告

HBase BlockCache系列文章到了终结篇,几个主角的是是非非也该有个了断了,在SlabCache被早早地淘汰之后,站在华山之巅的也就仅剩LRU君(LRUBlockCache)和CBC君(CombinedBlockCache).谁赢谁输,我说了不算,你说了也不算,那就来让数据说话.这篇文章主要对比LRU君和CBC君(offheap模式)分别在四种场景下几种指标(GC.Throughput.Latency.CPU.IO等)的表现情况.四种场景分别是缓存全部命中.少大部分缓存命中.少量缓存命

windows 性能选项视觉效果更改用C#怎么实现

问题描述 计算机-->属性-->高级-->性能(设置)--->视觉效果-->更改框内的内容值用c#怎么实现更改?1.修改注册表?修改注册表要修改到那些项?找的HCUControlPanelDesktop下面的键值,修改好像不行,特别是选择项为"调整为最佳外观的"时候,修改注册表,不会将其变为自定义2.SystemParametersInfofunction?http://msdn.microsoft.com/en-US/library/ms724947(V

由一个性能问题引出的.net概念

概念|问题|性能 由一个性能问题引出的.net概念 关键字:.net 性能 GC 值类型 引用类型 堆 堆栈 string 1 引子我们先来看一下两组代码,每组中的哪一段代码效率更高呢? 第一组: 代码1: for(int i = 0; i < 10000; i++) { AddressData ds = new AddresssData(); ds = addressS.GetAddress(); } 代码2: for(int i = 0; i < 10000; i++) { Address

性能最高提升300%!阿里云数据库HBase版上线

阿里云正式推出云数据库HBase版(ApsaraDB forHBase),100%兼容HBase协议的分布式数据库,基于HDFS分布式文件系统,支持高达10PB的存储空间,满足最高5000W QPS的随机读写场景.能支撑海量结构化数据存储.高并发访问等需求,适用于物联网.车联网.监控.安全风控.即时通讯.消息存储等行业场景用户. 产品内核架构深度优化,运维效率大幅提升 阿里云数据库专家对原生HBase内核源码进行深度优化,让云数据库HBase版(ApsaraDB for HBase)的读写性能相

HBase最佳实践-列族设计优化

随着大数据的越来越普及,HBase也变得越来越流行.会用HBase现在已经变的并不困难,然而,怎么把它用的更好却并不简单.那怎么定义'用的好'呢?很简单,在保证系统稳定性.可用性的基础上能够用最少的系统资源(CPU,IO等)获得最好的性能(吞吐量,读写延迟)就是'用的好'.HBase是一个庞大的体系,涉及到很多方面,很多因素都会影响到系统性能和系统资源使用率,根据场景对这些配置进行优化会很大程度上提升系统的性能.笔者总结至少有如下几个方面:HDFS相关配置优化,HBase服务器端优化(GC优化.

那么问题来了:我们为什么要选择 Hbase?

Apache HBase是一个高性能.面向列.可伸缩的开源分布式NoSQL数据库,基于google三大论文中的<Bigtable:一个分布式的结构化数据存储系统>,它是Google Bigtable的开源实现.Google Bigtable中文版下载链接 用户使用它能够在廉价的PC server上搭建大规模的结构化存储集群:因为Hbase是构建在hadoop之上,具有很好的横向扩展能力.                                                      

ASP.NET应用程序性能优化

asp.net|程序|性能|优化 [把前一段时间给单位项目所做性能优化的一些想法整理了以下,分享交流] ASP.NET 应用程序性能优化 1 前言性能优化的主要目标是提高"并发用户数量","吞吐量","可靠性"这样几个指标. 本质上说,性能优化的工作应该是多方面的,要做到"点面结合.由表及里".比如:从代价的角度来考虑,应尽量做到改动量小,易实施:从用户角度看,应做到快速响应或快速提示:从软件结构的角度看,又要兼顾到系统结构的