HBase有几个高级特性,在你设计表时可以使用。这些特性不一定联系到模式或行键设计,但是它们定义了某些方面的表行为。本节我们讨论这些配置参数,以及你可以如何使用它们。
1 可配置的数据块大小
HFile数据块大小可以在列族层次设置。这个数据块不同于之前谈到的HDFS数据块。其默认值是65,536字节,或64KB。数据块索引存储每个HFile数据块的起始键。数据块大小设置影响到数据块索引的大小。数据块越小,索引越大,从而占用更大内存空间。同时因为加载进内存的数据块更小,随机查找性能更好。但是如果你需要更好的序列扫描性能,那么一次能够加载更多HFile数据进入内存则更为合理,这意味着数据块应该设置为更大的值。相应地索引变小,你将在随机读性能上付出代价。
你可以在表实例化时设置数据块大小,如下所示:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', BLOCKSIZE => '65536'}
2 数据块缓存
把数据放进读缓存,但工作负载却经常不能从中获得性能提升——例如,如果一张表或表里的列族只被顺序化扫描访问或者很少被访问,你不会介意Get或Scan花费时间是否有点儿长。在这种情况下,你可以选择关闭那些列族的缓存。如果你只是执行很多顺序化扫描,你会多次倒腾缓存,并且可能会滥用缓存把应该放进缓存获得性能提升的数据给排挤出去。如果关闭缓存,你不仅可以避免上述情况发生,而且可以让出更多缓存给其他表和同一表的其他列族使用。
数据块缓存默认是打开的。你可以在新建表或者更改表时关闭它:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', BLOCKCACHE => 'false’}
3 激进缓存
你可以选择一些列族,赋予它们在数据块缓存里有更高的优先级(LRU缓存)。如果你预期一个列族比另一个列族随机读更多,这个特性迟早用得上。这个配置也是在表实例化时设定:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', IN_MEMORY => 'true'}
IN_MEMORY参数的默认值是false。因为HBase除了在数据块缓存里保存这个列族相比其他列族更激进之外并不提供额外的保证,该参数在实践中设置为true不会变化太大。
4 布隆过滤器(Bloom filters)
数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块。但是它的效用是有限的。HFile数据块的默认大小是64KB,这个大小不能调整太多。
如果你要查找一个短行,只在整个数据块的起始行键上建立索引无法给你细粒度的索引信息。例如,如果你的行占用100字节存储空间,一个64KB的数据块包含(64 * 1024)/100 = 655.53 = ~700行,而你只能把起始行放在索引位上。你要查找的行可能落在特定数据块上的行区间里,但也不是肯定存放在那个数据块上。这有多种情况的可能,或者该行在表里不存在,或者存放在另一个HFile里,甚至在MemStore里。这些情况下,从硬盘读取数据块会带来IO开销,也会滥用数据块缓存。这会影响性能,尤其是当你面对一个巨大的数据集并且有很多并发读用户时。
布隆过滤器允许你对存储在每个数据块的数据做一个反向测试。当某行被请求时,先检查布隆过滤器看看该行是否不在这个数据块。布隆过滤器要么确定回答该行不在,要么回答它不知道。这就是为什么我们称它是反向测试。布隆过滤器也可以应用到行里的单元上。当访问某列标识符时先使用同样的反向测试。
布隆过滤器也不是没有代价。存储这个额外的索引层次占用额外的空间。布隆过滤器随着它们的索引对象数据增长而增长,所以行级布隆过滤器比列标识符级布隆过滤器占用空间要少。当空间不是问题时,它们可以帮助你榨干系统的性能潜力。
你可以在列族上打开布隆过滤器,如下所示:
hbase(main):007:0> create 'mytable',
{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
BLOOMFILTER参数的默认值是NONE。一个行级布隆过滤器用ROW打开,列标识符级布隆过滤器用ROWCOL打开。行级布隆过滤器在数据块里检查特定行键是否不存在,列标识符级布隆过滤器检查行和列标识符联合体是否不存在。ROWCOL布隆过滤器的开销高于ROW布隆过滤器。
5 生存时间(TTL)
应用系统经常需要从数据库里删除老数据。由于数据库很难超过某种规模,所以传统上数据库内建了许多灵活处理办法。例如,在TwitBase里你不愿意删除用户在使用应用系统期间生成的任何推帖。这些都是用户生成数据,将来有一天当你执行一些高级分析时可能有用。但是并不需要保存所有推帖用于实时访问。所以早于某个时间的推帖可以归档存放到平面文件里。
HBase可以让你在数秒内在列族级别设置一个TTL。早于指定TTL值的数据在下一次大合并时会被删除。如果你在同一单元上有多个时间版本,早于设定TTL的版本会被删除。你可以关闭TTL或者通过设置其值为INT.MAX_VALUE (2147483647)来让它永远打开(这是默认值)。你可以在建表时设置TTL,如下所示:
hbase(main):002:0> create 'mytable', {NAME => 'colfam1', TTL => '18000'}
该命令在colfam1列族上设置TTL为18,000秒=5小时。colfam1里超过5小时的数据将会在下一次大合并时被删除。
6 压缩
HFile可以被压缩并存放在HDFS上。这有助于节省硬盘IO,但是读写数据时压缩和解压缩会抬高CPU利用率。压缩是表定义的一部分,可以在建表或模式改变时设定。除非你确定不会从压缩中受益,我们推荐你打开表的压缩。只有在数据不能被压缩或者因为某种原因服务器的CPU利用率有限制要求的情况下,有可能会关闭压缩特性。
HBase可以使用多种压缩编码,包括LZO、Snappy和GZIP。LZO[1]和Snappy[2]是其中最流行的两种。Snappy由Google在2011年发布,发布不久Hadoop和HBase项目开始提供支持。在此之前,选择的是LZO编码。Hadoop使用的LZO原生库受GPLv2版权控制,不能放在Hadoop和Hbase的任何发行版里;它们必须单独安装。另一方面,Snappy拥有BSD许可(BSD-licensed),所以它更容易和Hadoop和HBase发行版捆绑在一起。LZO和Snappy的压缩比例和压缩/解压缩速度差不多。
当建表时你可以在列族上打开压缩,如下所示:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', COMPRESSION => 'SNAPPY'}
注意数据只在硬盘上是压缩的。在内存里(MemStore或BlockCache)或网络传输时是没有压缩的。
改变压缩编码的做法不应该经常发生,但是如果你的确需要改变某个列族的压缩编码,直接做就可以。你需要更改表定义,设定新压缩编码。此后合并时,生成的HFile全部会采用新编码压缩。这个过程不需要创建新表和复制数据。但你要确保直到改变编码后所有老HFile被合并后才能从集群中删除老编码函数库。
7 单元时间版本
HBase在默认情况下每个单元维护三个时间版本。这个属性是可以设置的。如果你只需要一个版本,推荐你在设置表时只维护一个版本。这样系统就不会保留更新单元的多个时间版本。时间版本也是在列族级设置的,可以在表实例化时设定:
hbase(main):002:0> create 'mytable', {NAME => 'colfam1', VERSIONS => 1}
你可以在同一个create语句里为列族指定多个属性,如下所示:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', VERSIONS => 1, TTL => '18000'}
你也可以指定列族存储的最少时间版本数,如下所示:
hbase(main):002:0> create 'mytable', {NAME => 'colfam1', VERSIONS => 5,
MIN_VERSIONS => '1'}
在列族上同时设定TTL也是迟早有用的。如果当前存储的所有时间版本都早于TTL,至少MIN_VERSION个最新版本会保留下来。这样确保在你的查询以及数据早于TTL时有结果返回。
[1] Lempel-Ziv-Oberhumer 压缩算法:www.oberhumer.com/opensource/lzo/。
[2] Snappy 压缩函数库,来自于Google:http://code.google.com/p/snappy/。
转载于:https://my.oschina.net/u/923508/blog/613522
分享到:
相关推荐
删除Hbase中某个表的一列值 命令 java -jar deleteOneColumn.jar(这个文件的路径) '表名' '列簇名' '列名'
除了基本的配置和启动外,还可以进行更高级的操作,例如创建新的 HBase 表、删除表等。例如: - 创建表 `scores` 并添加列族 `grade`: ```shell create 'scores','grade' ``` - 删除表 `scores` 中的 `grade` ...
每个表可以有多个列族,列族的配置在`hbase-default.xml`或表的Schema中。`hbase.table.name`定义表名,`hbase.column.family.name`定义列族名。列族的配置包括缓存大小、压缩算法等。 9. **数据块缓存** `hbase....
HBase是一种分布式、高性能、基于列族的NoSQL数据库,由Apache基金会开发并维护,它在大规模数据存储和实时查询方面表现出色。在HBase中,配置文件是系统运行的关键部分,它们定义了HBase如何与Hadoop生态系统交互,...
指导手册06:HBase安装部署 hbase配置文件
HBase是一个分布式、可扩展的列式数据库,它是Apache Hadoop生态系统的重要组成部分,专为处理大规模、半结构化或非结构化的数据集而设计。 - **HBase服务器架构**: - **HBaseMaster Server**:负责管理HRegion...
在分布式大数据存储领域,HBase作为一个高性能、列式存储的NoSQL数据库,广泛应用于处理海量结构化数据。本文将深入探讨HBase的核心配置文件及其重要参数,帮助你更好地理解和优化你的HBase集群。 HBase的配置主要...
HBase 和 ZooKeeper 配置详解 HBase 和 ZooKeeper 是两个非常重要的分布式系统组件,分别用于分布式数据库和分布式协调服务。今天,我们将详细介绍如何配置 HBase 和 ZooKeeper,以便更好地理解它们之间的交互。 ...
【HBase的安装与配置】 HBase是一款基于Google Bigtable设计思想的开源NoSQL数据库,主要应用于大数据领域,尤其适合实时查询和分析大规模数据。在本次实验中,我们将学习如何在Linux环境下,以伪分布式的方式安装...
HBase 的数据模型由行、列族和时间戳组成。数据在 HBase 中是按行存储的,并且每一行都有一个唯一的行键。列族是列的集合,它们以列族为单位存储在一起,并且可以动态地添加更多的列。时间戳则为每个值提供了版本...
提供的文档`hadoop_zookeeper_hbase集群配置.docx`应包含详细的步骤和配置示例,而`配置文件.rar`则可能包含了预设的配置模板,可以作为配置参考。在实际操作时,务必根据具体环境调整配置,确保所有节点之间的网络...
在Linux环境下,构建基于Hadoop集群的Zookeeper和Hbase安装及配置是一项关键任务,因为这两个组件在大数据处理中扮演着重要角色。Hadoop生态系统中的HBase是一个分布式数据库,它建立在Hadoop集群的HDFS(Hadoop ...
这篇实验报告主要涵盖了HBase的安装、配置以及基本应用,这是大数据技术中一个重要的组件,它是一个分布式的、面向列的数据库,尤其适合处理大规模的数据。 1. **HBase安装** - 首先,通过`sudo tar -zxf ~/下载/...
HBase2集群配置.pdf HBase2集群配置.pdf HBase2集群配置.pdf HBase2集群配置.pdf
HBase是Apache Hadoop生态系统中的一个分布式、高性能、版本化、列族式数据库,它提供了对大规模数据的实时访问。HBase设计的目标是处理PB级别的数据,并且可以在大型集群上运行,支持上万个节点。本文件包可能包含...
- 处理结果:解析返回的数据,通常是`TResult`对象,从中获取HBase行和列族的信息。 - 关闭资源:确保在操作完成后关闭连接,释放资源。 4. **实验步骤**:根据提供的文档`Hadoop(第八期第15周)书面作业.docx`,...
此外,为了提高性能和可靠性,你可能还需要调整其他高级配置,如HDFS的块大小、HBase的 Region 分区策略等。这些都需要根据你的硬件配置、数据规模和应用需求来定制。 总之,理解和配置好Hadoop与HBase的参数是确保...
### HBase的安装与配置详解 #### 前提条件 在进行HBase的安装与配置之前,确保已经具备以下两个前提条件: 1. **HDFS分布式文件系统**:HBase依赖于Hadoop的HDFS作为底层存储系统,因此必须先安装好HDFS。 2. **...
《HBase列式数据库实战详解》 HBase,作为NoSQL数据库家族中的重要成员,尤其在大数据领域扮演着不可或缺的角色。它是一个分布式的、面向列的数据库,特别适合处理大规模数据。本篇将深入探讨HBase的核心操作,包括...
HBase采用列式存储方式,数据按照行键(Row Key)进行排序。每个表被划分为多个Region,每个Region由一个Region Server负责管理。Region是表的逻辑分区,随着数据增长,Region会自动分裂以保持性能。在Region内部,...