HBase优化——读写优化

Hbase2.0查询优化

1)设置scan缓存redis

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

Scan scan = new Scan();
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以后,忘记关闭该类,它会一直和服务端保持链接,资源没法释放,从而致使服务端的某些资源不可用。spa

因此在用完以后,须要执行关闭操做,这点与JDBS操做MySQL相似。日志

Scan scan = new Scan()
ResultScanner scanner = table.getScanner(scan)
for (Result  rs <- scanner) {
   do something.....
}
scanner.close()

4) 禁用块缓存code

若是批量进行全表扫描,默认是有缓存的,若是此时有缓存,会下降扫描的效率。server

Scan scan = new Scan()
scan.setCacheBlocks(true|false);

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

5) 缓存查询结果

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

6)设定scan的查询范围

若是能够明确的扫描范围,建议设置scan的StartRow和StopRow

Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes("0000"));
scan.withStopRow(Bytes.toBytes("9999"));

7) 批量get执行

若是能够肯定rowkey的值,在批量查询的时候建议用批量Get方式

List<Get> gets = new ArrayList<Get>();
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操做。

相关文章
相关标签/搜索