本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法。有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客。

下面是本文总结的第一部分内容:表的设计相关的优化方法。

1. 表的设计

1.1 Pre-Creating Regions

默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。

有关预分区,详情参见:Table Creation: Pre-Creating Regions,下面是一个例子:

[java] view plaincopy
  1. public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)
  2. throws IOException {
  3. try {
  4. admin.createTable(table, splits);
  5. return true;
  6. catch (TableExistsException e) {
  7. logger.info("table " + table.getNameAsString() + " already exists");
  8. // the table already exists...
  9. return false;
  10. }
  11. }
  12. public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {
  13. byte[][] splits = new byte[numRegions-1][];
  14. BigInteger lowestKey = new BigInteger(startKey, 16);
  15. BigInteger highestKey = new BigInteger(endKey, 16);
  16. BigInteger range = highestKey.subtract(lowestKey);
  17. BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));
  18. lowestKey = lowestKey.add(regionIncrement);
  19. for(int i=0; i < numRegions-1;i++) {
  20. BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));
  21. byte[] b = String.format("6x", key).getBytes();
  22. splits[i] = b;
  23. }
  24. return splits;
  25. }

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的发生。

转载自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section1.html

  1. public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)
  2. throws IOException {
  3. try {
  4. admin.createTable(table, splits);
  5. return true;
  6. } catch (TableExistsException e) {
  7. logger.info("table " + table.getNameAsString() + " already exists");
  8. // the table already exists...
  9. return false;
  10. }
  11. }
  12. public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {
  13. byte[][] splits = new byte[numRegions-1][];
  14. BigInteger lowestKey = new BigInteger(startKey, 16);
  15. BigInteger highestKey = new BigInteger(endKey, 16);
  16. BigInteger range = highestKey.subtract(lowestKey);
  17. BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));
  18. lowestKey = lowestKey.add(regionIncrement);
  19. for(int i=0; i < numRegions-1;i++) {
  20. BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));
  21. byte[] b = String.format("6x", key).getBytes();
  22. splits[i] = b;
  23. }
  24. return splits;
  25. }

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的发生。

转载自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section1.html

HBase性能优化方法总结(2):表的设计相关推荐

  1. HBase性能优化方法总结(4):读表操作

    来自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section3.html 本文主要是 ...

  2. HBase性能优化方法总结(3):写表操作

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第二部分内容:写表操作相关的优化方法 ...

  3. HBase性能优化方法总结(四):数据计算

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第四部分内容:数据计算相关的优化方法 ...

  4. HBase性能优化方法总结(一):表的设计

    1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数 ...

  5. HBase性能优化方法总结(1):配置优化

    配置优化 zookeeper.session.timeout 默认值:3分钟(180000ms) 说明:RegionServer与Zookeeper间的连接超时时间.当超时时间到后,ReigonSer ...

  6. HBase性能优化方法总结

    目录 1. 表的设计 1.1 Pre-Creating Regions 1.2 Row Key 1.3 Column Family 1.4 In Memory 1.5 Max Version 1.6 ...

  7. HBase性能优化方法总结(三):读表操作

    3. 读表操作 3.1 多HTable并发读 创建多个HTable客户端用于读操作,提高读数据的吞吐量,一个例子: static final Configuration conf = HBaseCon ...

  8. HBase性能优化方法总结(二):写表操作

    2. 写表操作 2.1 多HTable并发写 创建多个HTable客户端用于写操作,提高写数据的吞吐量,一个例子: static final Configuration conf = HBaseCon ...

  9. mysql2表连接优化性能_MySQL性能优化方法二:表结构优化

    很多人都将 数据库设计范式 作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉 ...

最新文章

  1. 听食品企业大佬讲故事:寻找记忆深处的年味
  2. echarts - 使用echarts过程中遇到的问题(pending...)
  3. Android之如何解决Android Studio左边的的project不见了
  4. 三、Web服务器——HTTP协议 Response对象 ServletContext对象 学习笔记
  5. Java中dao层、service层、controller层、entity层和view层的概述
  6. 去哪儿-09-city-list
  7. Ora-00600 错误的代码含义及常用查询
  8. 文章,记录按内容分页显示,根据文章内容按字数进行分页(转)
  9. vs 服务容器中已存在服务_无服务器vs容器,企业如何正确选择?
  10. 计算机无法启动怎么重装系统,韩博士教你如何为系统崩溃无法开机的电脑重装系统...
  11. CSS样式实现雷达扫描动效
  12. 创业公司一年工作总结!
  13. 算数-02-史丰收算法
  14. Tilera发布首款100核心CPU TLE-Gx100
  15. android检测蜂窝网络,怎么检查您的Android设备蜂窝信号强度?
  16. 计算机学士学位英文翻译,各类学士、硕士和博士学位英文翻译及缩写
  17. systemverilog中rand机制的 $urandom_range()函数
  18. 计算机网络应用智能家居,计算机智能化网络应用研究
  19. androidUSB通信——打印机
  20. linux php curl扩展下载,linux下为php添加curl扩展的方法

热门文章

  1. 有年味的年会才够味|第12届信息化领袖峰会
  2. rocketMq - commitLog
  3. MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
  4. 如何分析用户的访问转换路径
  5. [转帖]爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
  6. Linux vim 梳理
  7. Ubuntu里解压tar.xz格式
  8. g711u与g729比较编码格式
  9. 在CentOS上搭建PHP服务器环境
  10. GIT和SVN之间的五个基本区别