博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hbase性能优化2
阅读量:5991 次
发布时间:2019-06-20

本文共 2704 字,大约阅读时间需要 9 分钟。

  hot3.png

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)

    }

  }

更多精彩内容请关注:

关注超人学院微信二维码:162218_tNbK_2273204.jpg

转载于:https://my.oschina.net/crxy/blog/419672

你可能感兴趣的文章
Tengine新增nginx upstream模块的使用
查看>>
云桌面的部署方案设计流程
查看>>
mysql C API 字符串玩转备份调优
查看>>
无线局域网技术与实践
查看>>
linux snmp配置
查看>>
linux sudo 重定向,实现只有系统管理员才有权限操作的文件中写入信息
查看>>
在zentyal操作系统内安装PacketiX ×××服务器端的步骤
查看>>
如何安全登录业务系统
查看>>
gridify瀑布流风格页面的加载更多功能
查看>>
IT在线 IT在线技术联盟
查看>>
我的友情链接
查看>>
FLO 文件处理方式
查看>>
Cisco Packet Tracert 之 三层交换机DHCP服务
查看>>
5年职业路圆满结束,精彩继续 (Update1)
查看>>
android发布混淆
查看>>
软件项目开发环境构建之五:Confluence、Jira、Bitbucket统一账户管理
查看>>
5G起步,LTE还该不该学?
查看>>
LAMP & LNMP架构php防注入的一些方法
查看>>
oracle 11g install on suse 12 sp3
查看>>
Spring4-内部bean
查看>>