HBase 日常
- 日常业务逻辑中编程的建议:
使用HTablePool而不是new HTable,并做好HTableInterface的及时回收;
尽量不要使用显式行锁,详情见
MR Scan或扫描量大时请关闭blockCache;
Scan时请酌情配置hbase.scanner.client.caching参数,达到RPC延迟和本地JVM内存管理的折衷;
请根据业务场景酌情配置hbase.client.pause(客户端重试间隔), hbase.client.retries.number(客户端重试次数), hbase.ipc.client.connection.maxidletime(RPC空闲超时时间,用于保护连接不会因为长时间无交互而断开);
默认开启BloomFilter,适合随机读比较多的场景;
Put时如果需要批量put,建议使用list而非autoFlush=false,这样语义上更友好;
Put时请使用系统隐式加锁,而非显式加锁;
不推荐用PrefixFilter,使用PrefixFilter的场景都可以用指定startrow和endrow来代替,startrow就是filter的string的Bytes,endrow就是set stoprow(Bytes.add(prefixBytes, new byte[]{(byte)0xff})) ;假如一定要用PrefixFilter,请指定startrow;否则最坏的情况下就扫全表了(可能会timeout,以及平白增加服务端负载)(假如prefix没有结果的话会扫全表);
分页offset,同mysql,oracle,在做分页处理时,越到后面的页,其实还是会扫到前面所有页的数据;除非在每次新页的时候指定startrow和limit;
Limit代码:
1 | ResultScanner rs = htable.getScanner(scan); |