[HBase] HBase client-side buffer 客户端缓存

来源:互联网 发布:mysql 最近10天 编辑:程序博客网 时间:2024/05/16 05:47

HBase Client 通过table.put(Put put)方法向Server端写数据,默认情况下,每次调用table.put()方法 ,就会触发一次RPC将数据提交到Server端

在批量写数据的情况下,过多的时间都浪费在RPC上了。

HBase Table 类提供了一个setAutoFlush(boolean) 方法,能够控制是否开启client side buffer(客户端缓存,其大小由hbase.client.write.buffer表示,可以在hbase-site.xml中设置,默认为2MB)

默认情况下,table.isAutoFlush()值为true,即未启用客户端缓存。开启缓存后,table.flushCommits()会触发RPC将缓存数据写到Server端,table.close 及缓存达到hbase.client.write.buffer阀值都会隐士调用flushCommits()。


    System.out.println(table.isAutoFlush());    table.setAutoFlush(false);    table.setWriteBufferSize(8*1024*1024);    System.out.println(table.getWriteBufferSize()/1024/1024+"MB");

client.buffer.size大小的设定要恰当,太小了会频繁调用RPC向Server(s)写数据,太大了会增加Server端内存开销。

首先,Write Buffer存在于客户端的本地内存中,那么当客户端运行出现问题时,会导致在Write Buffer中未提交的数据丢失;由于HBase服务端还未收到这些数据,因此也无法通过WAL日志等方式进行数据恢复。

其次,Write Buffer方式本身会占用客户端和HBase服务端的内存开销,具体见下节的详细分析。

预估WriteBuffer内存开销

客户端通过Write Buffer方式提交的话,会导致客户端和服务端均有一定的额外内存开销,Write Buffer Size越大,则占用的内存越大。客户端占用的内存开销可以粗略地使用以下公式预估:

hbase.client.write.buffer * number of HTable object for writing

而对于服务端来说,可以使用以下公式预估占用的Region Server总内存开销:

hbase.client.write.buffer * hbase.regionserver.handler.count * number of region server

其中,hbase.regionserver.handler.count为每个Region Server上配置的RPC Handler线程数。

原创粉丝点击