HBase性能优化方法总结(一):表的设计
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法。有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客。
下面是本文总结的第一部分内容:表的设计相关的优化方法。
1. 表的设计
1.1 Pre-Creating Regions
默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。
有关预分区,详情参见:Table Creation: Pre-Creating Regions,下面是一个例子:
复制代码
public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)
throws IOException {
try {
admin.createTable(table, splits);
return true;
} catch (TableExistsException e) {
logger.info("table " + table.getNameAsString() + " already exists");
// the table already exists...
return false;
}
}
public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {
byte[][] splits = new byte[numRegions-1][];
BigInteger lowestKey = new BigInteger(startKey, 16);
BigInteger highestKey = new BigInteger(endKey, 16);
BigInteger range = highestKey.subtract(lowestKey);
BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));
lowestKey = lowestKey.add(regionIncrement);
for(int i=0; i < numRegions-1;i++) {
BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));
byte[] b = String.format("%016x", key).getBytes();
splits[i] = b;
}
return splits;
}
复制代码
1.2 Row Key
HBase中row key用来检索表中的记录,支持以下三种方式:
通过单个row key访问:即按照某个row key键值进行get操作;
通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;
全表扫描:即直接扫描整张表中所有行记录。
在HBase中,row key可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,存为byte[]字节数组,一般设计成定长的。
row key是按照字典序存储,因此,设计row key时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为row key,这样能保证新写入的数据在读取时可以被快速命中。
1.3 Column Family
不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应被触发flush,最终导致系统产生更多的I/O。感兴趣的同学可以对自己的HBase集群进行实际测试,从得到的测试结果数据验证一下。
1.4 In Memory
创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中,保证在读取的时候被cache命中。
1.5 Max Version
创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。
1.6 Time To Live
创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)。
1.7 Compact & Split
在HBase中,数据在更新时首先写入WAL 日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时, 系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了(minor compact)。
StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行分割(split),等分为两个StoreFile。
由于对表的更新是不断追加的,处理读请求时,需要访问Store中全部的StoreFile和MemStore,将它们按照row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,通常合并过程还是比较快的。
实际应用中,可以考虑必要时手动进行major compact,将同一个row key的修改进行合并形成一个大的StoreFile。同时,可以将StoreFile设置大些,减少split的发生。
分享到:
相关推荐
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现,类似Google Bigtable...
HBase 表设计与性能优化 HBase 是一个分布式的、面向列的 NoSQL 数据库,设计良好的表结构对性能的影响至关重要。本文将从表设计、写表、读表三个方面对 HBase 性能优化进行总结。 表设计 1. 预先创建 Regions ...
│ Hbase表设计-微博案例的表设计 │ Hbase表设计-微博案例的业务实现 │ Hbase列簇属性的介绍 │ Hbase性能优化-GC调优 │ Hbase性能优化-内存管理 │ Hbase性能优化-flush、compact、split │ Hbase性能优化-配置...
HBase是一种分布式、基于列族的NoSQL数据库,由...然而,HBase的复杂性远不止于此,如表设计、故障恢复、监控及性能优化等方面都需要深入学习和实践。在实际应用中,根据业务需求选择合适的数据库和优化策略至关重要。
预分区是HBase表设计中的一个重要策略,它能有效解决因region split带来的资源消耗问题。在表创建时,用户可以根据一定的规则预先划分region,避免在数据快速增长时频繁进行split操作。这不仅可以提高HBase的性能,...
接下来,编写一个简单的Java程序,如`ExampleForHBase`,它展示了如何连接到Hbase,创建表,插入数据,以及获取数据。代码示例中,我们创建了一个名为"student"的表,包含一个列族"score",并插入了张三的各科成绩...
- **HBase设计**:使用Rowkey来构建地理位置的层次结构,例如使用作为行键的前缀,和作为列族来存储父子关系。 #### 案例2. 学生课程数据(Student-Course) - **数据需求**:需要记录学生和课程之间的多对多关系。...
在设计HBase的表结构(Schema)时,与关系型数据库系统相比,就像是完全不同的游戏。HBase没有传统意义上的表连接,数据模型必须围绕行键、列族以及列限定符(column qualifiers)来组织,以提高访问速度和存储效率...
【HBase数据库设计】 HBase是一种基于列存储的分布式数据库,它是Apache Hadoop生态系统的一部分,设计用于处理海量数据。HBase的主要特征包括: 1. **分布式存储**:HBase构建在Hadoop的HDFS(Hadoop Distributed...
在本文中,我们将深入探讨如何...理解HBase的表结构、行键设计、列族和时间戳等概念对于有效地使用Scala API操作HBase至关重要。同时,熟悉HBase的RegionServer和Master节点的工作原理也有助于优化你的应用程序性能。
- **第4章:HBase表设计**:讲解如何有效地设计HBase表结构以满足特定的应用需求,包括如何选择合适的列族、如何优化数据模型以提高查询性能等。 - **第5章:通过Coprocessors扩展HBase**:Coprocessors是HBase中...
书中不仅涵盖了HBase的核心概念和技术细节,还包括了如何设计高性能的HBase表,如何通过协处理器进行业务逻辑的定制,以及如何利用HBase构建实际应用的知识。这些内容对于想要深入理解和应用HBase的读者来说,是...
【大数据处理:HBASE.ppt】的文档主要探讨了从关系型数据库(RDBMS)向分布式非关系型数据库HBase的转换,以及HBase在大数据处理中的表设计、操作方式和最佳实践。 1. **从RDBMS到HBase的表设计转变** - RDBMS基于...
1. **Hbase基础理论**:包括Hbase的数据模型、表的设计、行键与列族的概念,以及Hbase如何通过 Region Server 实现数据分区和负载均衡。 2. **Hbase操作与管理**:介绍如何使用Hbase Shell进行数据操作,如创建、...
HBase技术分享主要涉及到HBase的基本概念、操作、数据模型设计以及表属性配置等多个方面的知识点。接下来,将对HBase的核心知识点进行详细解读。 首先,HBase是一个开源的、分布式的、列式存储的非关系型数据库,它...
本文将详细介绍 HBase 多表关联查找的知识点,涵盖了 HBase 表结构设计、rowkey 设计、columnfamily 设计、column 设计等方面的内容,并结合实际应用场景,提供了一些实用的设计方法和思路。 1. 表的属性 HBase 表...