hbase 读写调优_HBase优化——读写优化

Hbase2.0查询优化

1)设置scan缓存

HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能。

Scan scan = newScan();

scan.setCaching(1000);

2)显示的指定列

当使用Scan或者GET获取大量的行时,最好指定所需要的列,因为服务端通过网络传输到客户端,数据量太大可能是瓶颈。如果能有效过滤部分数据,能很大程度的减少网络I/O的花费。

Scan scan = new Scan();

scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));

scan.addFamily(Bytes.toBytes("f"));

Get get = new Get(Bytes.toBytes("demo"));

get.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));

get.addFamily(Bytes.toBytes("f"));

一般情况下用:

scan.addColumn(…)

3)关闭ResultScanner

如果在使用 table.getScanner之后,忘记关闭该类,它会一直和服务端保持连接,资源无法释放,从而导致服务端的某些资源不可用。

所以在用完之后,需要执行关闭操作,这点与JDBS操作MySQL类似。

Scan scan = newScan()

ResultScanner scanner=table.getScanner(scan)for (Result rs

}

scanner.close()

4) 禁用块缓存

如果批量进行全表扫描,默认是有缓存的,如果此时有缓存,会降低扫描的效率。

Scan scan = newScan()

scan.setCacheBlocks(true|false);

对于经常读到的数据,建议使用默认值,开启块缓存

5) 缓存查询结果

对于频繁查询HBase的应用场景,可以考虑在应用程序和Hbase之间做一层缓存系统(redis等),新的查询先去缓存查,缓存没有再去查Hbase。

6)设定scan的查询范围

如果可以明确的扫描范围,建议设置scan的StartRow和StopRow

Scan scan = newScan();

scan.withStartRow(Bytes.toBytes("0000"));

scan.withStopRow(Bytes.toBytes("9999"));

7) 批量get执行

如果可以确定rowkey的值,在批量查询的时候建议用批量Get方式

List gets = new ArrayList();

gets.add(new Get(Bytes.toBytes("000")));

gets.add(new Get(Bytes.toBytes("111")));

gets.add(new Get(Bytes.toBytes("222")));

gets.add(new Get(Bytes.toBytes("333")));

table.get(gets)

Hbase2.0写入优化

写也是Hbase常有的操作之一,并且Hbase在写入操作上有着其他NoSQL无法比拟的优势,下面讲如何优化写入操作

1)关闭写WAL日志

一般为了保证系统的高可用性,WAL日志默认是开启状态,WAL主要用于灾难恢复的,如果应用可以容忍一定的数据丢失风险,可以在写数据的时候,关闭写WAL。

风险: 当RegionServer宕机时,写入的数据出现丢失,且无法恢复

2)设置AutoFlush

Htable有一个属性是AutoFlush,该属性用于支持客户端的批量更新,默认是true,当客户端每收到一条数据,立刻发送到服务端,如果设置为false,当客户端提交put请求时候,先将该请求在客户端缓存,到达阈值的时候或者执行hbase.flushcommits(),才向RegionServer提交请求。

table.setAutoFlush(false);

table.setWriteBufferSize(12 * 1024 * 1024 );

3)预创建Region

一般表刚开始只有一个Region,插入该表的数据都会保存在此Region中,插入该表的所有塑化剂都会保存在该Region中,当到达一定的阈值时,才发生分裂。 这样开始时刻针对该表的写操作都集中在某台服务器上,造成这台服务器的压力很紧张,同时对整个集群资源的浪费

建议刚开始的时候预创建Region,可以使用Hbase自带的RegionSplitter

4)延迟日志flush

默认写入操作,首先写入WAL,并且在1S内写入HDFS,这个时间默认是1S,可以通过参数配置

hbase.regionserver.optionallogflushinterval

可以配置大一点的值,比如5s,这段时间数据会保留在内存中,直到RegionServer周期性的执行flush操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值