hbase性能优化

1)配置
  当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置文件都存在并且都设置好了相应参上面的属性下面的属性即可
2)关于建表
   
public void createTable(HTableDescriptor desc)
HTableDescriptor 代表的是表的schema, 提供的方法中比较有用的有
setMaxFileSize,指定最大的regionsize
setMemStoreFlushSize 指定memstoreflush到HDFS上的文件大小
增加family通过 addFamily方法
  
public void addFamily(final HColumnDescriptor family)
HColumnDescriptor 代表的是column的schema,提供的方法比较常用的有
setTimeToLive:指定最大的TTL,单位是ms,过期数据会被自动删除。
setInMemory:指定是否放在内存中,对小表有用,可用于提高效率。默认关闭
setBloomFilter:指定是否使用BloomFilter,可提高随机查询效率。默认关闭
setCompressionType:设定数据压缩类型。默认无压缩。
setMaxVersions:指定数据最大保存的版本个数。默认为3。
注意的是,一般我们不去setInMemory为true,默认是关闭的
3)关于入库
   官方建议
table.setAutoFlush(false);//数据入库之前先设置此项为false
table.setflushCommits();//入库完成后,手动刷入数据
注意:
  在入库过程中,put.setWriteToWAL(true/flase);
  关于这一项如果不希望大量数据在存储过程中丢失,建议设置为true,如果仅是在测试演练阶段,为了节省入库时间建议设置为false
4)关于获取表实例
HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);
HTable table = (HTable) pool.getTable(tableName);
建议用表连接池的方式获取表,具体池有什么作用,我想用过数据库连接池的同学都知道,我就不再重复
不建议使用new HTable(configuration,tableName);的方式获取表
5)关于查询
建议每个查询语句都放入try catch语句块,并且finally中要进行关闭ResultScanner实例以及将不使用的表重新放入到HTablePool中的操作,具体做法如下
Java代码

  • public static void QueryAll(String tableName) {       
  •         HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);       
  •         HTable table = null;       
  •         ResultScanner rs = null;       
  •         try {       
  •             Scan scan = new Scan();       
  •             table = (HTable) pool.getTable(tableName);       
  •             rs = table.getScanner(scan);       
  •             for (Result r : rs) {       
  •                 System.out.println("获得到rowkey:" + new String(r.getRow()));       
  •                 for (KeyValue keyValue : r.raw()) {       
  •                     System.out.println("列:" + new String(keyValue.getFamily())       
  •                             + "====值:" + new String(keyValue.getValue()));       
  •                 }       
  •             }       
  •         } catch (IOException e) {       
  •             e.printStackTrace();       
  •         }finally{       
  •             rs.close();// 最后还得关闭   
  •             pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)   
  •         }       
  •     }  
public static voidQueryAll(String tableName) {
    HTablePool pool = new HTablePool(configuration,Integer.MAX_VALUE);
    HTable table = null;
    ResultScanner rs = null;
    try {
      Scan scan = new Scan();
      table = (HTable) pool.getTable(tableName);
      rs = table.getScanner(scan);
      for (Result r : rs) {
        System.out.println("获得到rowkey:" + new String(r.getRow()));
        for (KeyValue keyValue : r.raw()) {
          System.out.println("列:" + newString(keyValue.getFamily())
              + "====值:" + new String(keyValue.getValue()));
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }finally{
      rs.close();// 最后还得关闭
      pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)
    }
  }
更多精彩内容请关注:http://bbs.superwu.cn 
关注超人学院微信二维码:

作者:crxy2014 发表于2015/5/25 16:16:30 原文链接
阅读:0 评论:0 查看评论

你可能感兴趣的:(hbase,性能优化)