欢迎您关注《大数据成神之路》
一个系统上线之后,开发和调优将一直贯穿系统的生命周期中,HBase也不列外。这里学习下HBase的调优。
作为NoSQL数据库,增删改查是其最基本的功能,其中查询是最常用的一项。
HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能。
public void setCaching(int caching) {
this.caching = caching;
}
当使用Scan或者GET获取大量的行时,最好指定所需要的列,因为服务端通过网络传输到客户端,数据量太大可能是瓶颈。如果能有效过滤部分数据,能很大程度的减少网络I/O的花费。
public Scan addFamily(byte [] family) {
familyMap.remove(family);
familyMap.put(family, null);
return this;
}
public Scan addColumn(byte [] family, byte [] qualifier) {
NavigableSet<byte []> set = familyMap.get(family);
if(set == null) {
set = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
}
if (qualifier == null) {
qualifier = HConstants.EMPTY_BYTE_ARRAY;
}
set.add(qualifier);
familyMap.put(family, set);
return this;
}
一般用: scan.addColumn(...)
scanner.close()
如果批量进行全表扫描,默认是有缓存的,如果此时有缓存,会降低扫描的效率。
scan.setCacheBlocks(true|false);
对于经常读到的数据,建议使用默认值,开启块缓存。
对于频繁查询HBase的应用场景,可以考虑在应用程序和Hbase之间做一层缓存系统,新的查询先去缓存查,缓存没有再去查Hbase。
写也是Hbase常有的操作之一,并且Hbase在写入操作上有着其他NoSQL无法比拟的优势,下面讲如何优化写入操作
风险: 当RegionServer宕机时,写入的数据出现丢失,且无法恢复。
风险 在请求未发送到RegionServer之前客户端崩溃,数据也会丢失
table.setAutoFlush(false);
table.setWriteBufferSize( 12 * 1024 * 1024 );
一般表刚开始只有一个Region,插入该表的数据都会保存在此Region中,插入该表的所有塑化剂都会保存在该Region中,当到达一定的阈值时,才发生分裂。 这样开始时刻针对该表的写操作都集中在某台服务器上,造成这台服务器的压力很紧张,同时对整个集群资源的浪费。
建议刚开始的时候预创建Region,可以使用Hbase自带的RegionSplitter
hbase.regionserver.optionallogflushinterval
可以配置大一点的值,比如5s,这段时间数据会保留在内存中,直到RegionServer周期性的执行flush操作。
希望能帮助大家。