查询优化
批量get请求
使用批量请求,可以减少RPC的次数,显著提高吞吐量。批量get请求要么成功返回所有请求数据,要么抛出异常。
设置Scan缓存
一次scan可能会返回大量数据,但是实际客户端发起一次scan请求,并不会将所有数据一次性加载到本地,而是分成多次RPC请求进行加载,这样设计一方面是因为大量数据请求可能会导致网络带宽严重消耗进而影响其他业务,另一方面是有可能因为数据量太大导致客户端发生OOM。所以采用先加载一部分数据到本地,然后进行遍历,每次加载一部分数据,如此往复,直至所有数据加载完成。数据加载到本地就存放在scan缓存中,默认100。
通常情况下,默认的scan缓存设置就可以正常工作的。但是在一些大scan(一次scan可能需要查询几万甚至几十万行数据)来说,每次请求100条数据意味着一次scan需要几百甚至几千次RPC请求,这种交互的代价无疑是很大的。因此可以考虑将scan缓存设置增大。
指定读取的列
HBase是列族数据库,同一列族的数据存储在一块,不同列族是分开存储的,如果一个表由多个列族,只是根据RowKey而不指定列族进行检索的话,不同列族的数据需要独立进行检索,性能必然会比指定列族的查询差的多。
此外指定请求的列的话,不需要将整个列族的所有列的数据返回,这样就减少了网路IO。
关闭ResultScanner
在使用table.getScanner之后,记得关闭,否则它会和服务器端一直保持连接,资源无法释放,从而导致服务端的某些资源不可用。
禁用块缓存
当离线访问HBa