HBase BufferedMutator与PutList性能

Par*_*hit 5 java optimization hbase hbase-client

我最近遇到了BufferedMutator类的HBase,它可以用于批量插入和删除.我以前使用List来放置数据hTable.put(putList)以做同样的事情.对我的代码进行基准测试似乎并没有显示出太大的差异,而是我在做的事情mutator.mutate(putList);.使用BufferedMutator而不是PutList有显着的性能提升吗?

Ash*_*uri 11

简答

BufferedMutator通常提供更好的吞吐量比只使用Table#put(List<Put>),但需要适当的调整hbase.client.write.buffer,hbase.client.max.total.tasks,hbase.client.max.perserver.taskshbase.client.max.perregion.tasks获得良好的性能.

说明

将放置列表传递给HBase客户端时,它会按目标区域对放置进行分组,并按目标区域服务器对这些组进行批处理.为每个批次发送一个rpc请求.这减少了rpc开销,特别是在Puts非常小的情况下,因此每个请求的rpc开销很大.

Table客户端发送的所有看跌期权立即向区服务器并等待回应.这意味着任何可能发生的批处理都限于单个API调用中的Puts数量,并且api调用从调用者的角度来看是同步的.但是,BufferedMutator保持缓冲Puts在缓冲区中并决定根据被调用类包围的后台线程中的当前缓冲大小来刷新缓冲的puts AsyncProcess.从调用者的角度来看,每个API调用仍然是同步的,但整个缓冲策略提供了更好的批处理.后台刷新模型还允许连续的请求流,结合更好的批处理意味着支持更多客户端线程的能力.但是,由于这种缓冲策略,缓冲区越大,调用者看到的每个操作延迟越差,但是通过拥有更多数量的客户端线程可以维持更高的吞吐量.

控制BufferedMutator吞吐量的一些配置是:

hbase.client.write.buffer:缓冲区的大小(字节)(更高可提供更好的峰值吞吐量,消耗更多内存)

hbase.client.max.total.tasks:AsyncProcess开始阻止请求之前跨群集的待处理请求数(越高越好,但可能在客户端上饿死CPU,或导致服务器过载)

hbase.client.max.perserver.tasks:AsyncProcess开始阻止请求之前一个区域服务器的挂起请求数.

hbase.client.max.perregion.tasks:每个区域的待处理请求数.

此外,为了完整起见,不言而喻,如果瓶颈在服务器端而不是客户端,那么BufferedMutator通过Table在客户端上使用over ,您将不会看到太多的性能提升.

  • 对,那是正确的.事实上,HTable #put内部使用BufferedMutator#mutate并在此之后立即调用BufferedMutator#flush().有一个HTable#setAutoFlush API,可用于在HTable中禁用/启用此自动刷新行为.如果禁用,HTable客户端将变为BufferedMutator.但是,不建议使用HTable#setAutoFlush API,如果要使用缓冲写入以获得更好的客户端写入吞吐量,建议您直接使用BufferedMutator. (2认同)