`
huangxueyong
  • 浏览: 1821 次
  • 性别: 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性能优化是一个综合性的任务,涉及硬件配置、数据模型设计、查询策略、运维管理等多个方面。只有全方位考虑并实践这些策略,才能最大化发挥HBase的性能潜力,满足大数据时代下的高效率需求。

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

    本文将从表设计、写表、读表三个方面对 HBase 性能优化进行总结。 表设计 1. 预先创建 Regions 在创建 HBase 表的时候,默认情况下,HBase 会自动创建一个 region 分区。当导入数据的时候,所有的 HBase 客户端都...

    HBase写性能优化策略

    总结来说,HBase写性能优化可以从多个方面入手,包括调整WAL写入机制、使用批量操作、合理分配Region、保证请求均衡以及控制KeyValue大小。每个策略都有其适用的业务场景和优势,系统管理员和开发者应根据实际需求和...

    Hbase总结.docx

    1. 表设计:预分区是避免初期数据热点的关键,应根据预期数据量合理划分Region。 2. RowKey优化:遵循Rowkey设计原则,保证数据的均衡分布和高效查询。 3. Column Family管理:尽量减少Column Family数量,以降低...

    \"HBase_介绍和HBase云存储\"分享总结

    4. **HBase的优化策略**:包括表设计、region大小调整、负载均衡、读写优化等,以提高系统性能。 接下来,我们将重点关注“HBase云存储”。在云计算环境中,HBase的优势更加凸显: 1. **云存储的扩展性**:HBase的...

    最新版linux hbase-2.3.3-bin.tar.gz

    HBase 2.3.3还包括对性能优化、稳定性增强、新的API支持等方面的改进。例如,RegionSplitPolicy优化了区域分裂策略,以提高负载均衡;而Cell级别的ACL增强了数据安全性。 总结来说,Linux上的HBase 2.3.3是一个强大...

    Hbase实验报告.pdf

    在实际应用中,由于HBase的分布式特性,查询性能依赖于良好的Row Key设计。合理规划Row Key,可以提高数据访问速度和空间效率。此外,可以使用Scan操作进行范围查询,或通过Filter进行更复杂的过滤。 ### 6. 遇到的...

    Hbase学习总结.rar

    **HBase学习总结** HBase,全称是Apache HBase,是一个分布式的、面向列的开源数据库,它是基于Google的Bigtable模型构建的,专为处理海量数据而设计。HBase是Apache Hadoop生态系统的一部分,它运行在Hadoop分布式...

    浅谈HBASE数据结构设计.pdf

    - 行键(Row Key):行键用于唯一标识表中的每一行,行键的长度没有限制,行键的设计对性能有很大影响。 - 单元格(Cell):单元格是数据存储的基本单位,每个单元格存储同一列下不同行的数据,可以包含多个版本的...

    Hbase个人总结

    总之,HBase作为一种高性能的非关系型数据库系统,以其独特的面向列存储设计、高可靠性和出色的可扩展性,成为了处理大规模数据集的理想选择。无论是对于实时数据处理还是数据分析应用,HBase都能够提供强有力的支持...

    hbase数据可视化系统

    2. 性能优化:合理设计RowKey,避免热点问题;使用HBase的Compaction和Split机制,保持Region的平衡;并考虑使用二级索引提高查询效率。 六、总结 通过SpringBoot搭建的HBase可视化系统,使得非技术人员也能便捷地...

    hbase-2.4.17-bin 安装包

    HBase是Apache Hadoop生态系统中的一个分布式、版本化、列族式存储系统,设计用于处理大规模数据集。这个“hbase-2.4.17-bin”安装包提供了HBase的最新稳定版本2.4.17,适用于大数据处理和分析场景。下面将详细介绍...

    hbase2.5.6最新版本下载

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在2.5.6这个版本中,HBase继续提供高性能、高可靠性以及可扩展性的特性,使得它成为大数据存储的理想选择。...

    hbase-1.2.7-bin.tar.gz

    总结来说,“hbase-1.2.7-bin.tar.gz”是一个完整的HBase发行版,它提供了在分布式环境下存储和管理大规模结构化数据的能力。通过理解其核心概念和工作原理,以及掌握安装和使用方法,我们可以有效地利用HBase处理...

    HBase企业应用开发实战-马延辉 孟鑫

    4. **HBase性能优化**:书中详细分析了HBase的性能瓶颈,并提供了多种优化策略,如Region划分、负载均衡、缓存管理等,以提升系统的读写性能和响应速度。 5. **HBase与Hadoop集成**:由于HBase是Hadoop生态系统的一...

    大数据处理:HBASE.ppt

    - RowKey设计是优化HBase性能的关键,因为它决定了数据的分布和访问模式。 - 示例中提到,对于日志数据,可以设计多种RowKey格式以适应不同查询需求,如按机器名、时间、事件排序,或者按时间、机器名排序,甚至...

Global site tag (gtag.js) - Google Analytics