`
乡里伢崽
  • 浏览: 111899 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hbase 表设计

 
阅读更多
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 表设计与操作

    HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现,类似Google Bigtable...

    HBase 表设计 写表、读表 性能优化 word文档

    HBase 表设计与性能优化 HBase 是一个分布式的、面向列的 NoSQL 数据库,设计良好的表结构对性能的影响至关重要。本文将从表设计、写表、读表三个方面对 HBase 性能优化进行总结。 表设计 1. 预先创建 Regions ...

    大数据开发之案例实践Hbase的设计及企业优化视频教程(视频+讲义+笔记+配置+代码+练习)

    │ Hbase表设计-微博案例的表设计 │ Hbase表设计-微博案例的业务实现 │ Hbase列簇属性的介绍 │ Hbase性能优化-GC调优 │ Hbase性能优化-内存管理 │ Hbase性能优化-flush、compact、split │ Hbase性能优化-配置...

    Hbase 安装与基本使用

    HBase是一种分布式、基于列族的NoSQL数据库,由...然而,HBase的复杂性远不止于此,如表设计、故障恢复、监控及性能优化等方面都需要深入学习和实践。在实际应用中,根据业务需求选择合适的数据库和优化策略至关重要。

    hbase的Rowkey设计方案.pdf

    预分区是HBase表设计中的一个重要策略,它能有效解决因region split带来的资源消耗问题。在表创建时,用户可以根据一定的规则预先划分region,避免在数据快速增长时频繁进行split操作。这不仅可以提高HBase的性能,...

    Hbase的安装过程及基本操作

    接下来,编写一个简单的Java程序,如`ExampleForHBase`,它展示了如何连接到Hbase,创建表,插入数据,以及获取数据。代码示例中,我们创建了一个名为"student"的表,包含一个列族"score",并插入了张三的各科成绩...

    Hbase_schema_表设计教程整理版.pdf

    - **HBase设计**:使用Rowkey来构建地理位置的层次结构,例如使用作为行键的前缀,和作为列族来存储父子关系。 #### 案例2. 学生课程数据(Student-Course) - **数据需求**:需要记录学生和课程之间的多对多关系。...

    HBase schema 设计(英文)

    在设计HBase的表结构(Schema)时,与关系型数据库系统相比,就像是完全不同的游戏。HBase没有传统意义上的表连接,数据模型必须围绕行键、列族以及列限定符(column qualifiers)来组织,以提高访问速度和存储效率...

    HBase数据库设计.doc

    【HBase数据库设计】 HBase是一种基于列存储的分布式数据库,它是Apache Hadoop生态系统的一部分,设计用于处理海量数据。HBase的主要特征包括: 1. **分布式存储**:HBase构建在Hadoop的HDFS(Hadoop Distributed...

    scala API 操作hbase表

    在本文中,我们将深入探讨如何...理解HBase的表结构、行键设计、列族和时间戳等概念对于有效地使用Scala API操作HBase至关重要。同时,熟悉HBase的RegionServer和Master节点的工作原理也有助于优化你的应用程序性能。

    HBase学习利器:HBase实战

    - **第4章:HBase表设计**:讲解如何有效地设计HBase表结构以满足特定的应用需求,包括如何选择合适的列族、如何优化数据模型以提高查询性能等。 - **第5章:通过Coprocessors扩展HBase**:Coprocessors是HBase中...

    HBase 实战

    书中不仅涵盖了HBase的核心概念和技术细节,还包括了如何设计高性能的HBase表,如何通过协处理器进行业务逻辑的定制,以及如何利用HBase构建实际应用的知识。这些内容对于想要深入理解和应用HBase的读者来说,是...

    大数据处理:HBASE.ppt

    【大数据处理:HBASE.ppt】的文档主要探讨了从关系型数据库(RDBMS)向分布式非关系型数据库HBase的转换,以及HBase在大数据处理中的表设计、操作方式和最佳实践。 1. **从RDBMS到HBase的表设计转变** - RDBMS基于...

    大数据书籍-Hbase架构设计(高清)

    1. **Hbase基础理论**:包括Hbase的数据模型、表的设计、行键与列族的概念,以及Hbase如何通过 Region Server 实现数据分区和负载均衡。 2. **Hbase操作与管理**:介绍如何使用Hbase Shell进行数据操作,如创建、...

    hbase技术分享

    HBase技术分享主要涉及到HBase的基本概念、操作、数据模型设计以及表属性配置等多个方面的知识点。接下来,将对HBase的核心知识点进行详细解读。 首先,HBase是一个开源的、分布式的、列式存储的非关系型数据库,它...

    HBase多表关联查找资料

    本文将详细介绍 HBase 多表关联查找的知识点,涵盖了 HBase 表结构设计、rowkey 设计、columnfamily 设计、column 设计等方面的内容,并结合实际应用场景,提供了一些实用的设计方法和思路。 1. 表的属性 HBase 表...

Global site tag (gtag.js) - Google Analytics