我正在处理一个批处理作业,通过HTableInterface将一批Put对象处理到HBase中。接口方法有两种:HTableInterface.put(列表)和HTableInterface.put(Put)。
我想知道,对于相同数量的Put对象,批量put是否比逐个put更快?
另一个问题是,我放置了一个非常大的Put对象,这导致作业失败。Put对象的大小似乎有一个限制。它能有多大?
发布于 2015-11-07 03:36:03
put(List<Put> puts)或put(Put aPut)在引擎盖下是相同的。他们都给doPut(List<Put> puts)打电话。
重要的是@ozhang提到的缓冲区大小。例如,默认值为2MB。
<property>
<name>hbase.client.write.buffer</name>
<value>2097152</value>
</property>每次写入缓冲区被填满并触发flushCommits()时,都会有1rpc。因此,如果您的应用程序因为对象相对较大而经常刷新,那么尝试增加写缓冲区大小可以解决这个问题。
发布于 2015-03-01 06:04:09
如果你的键值很大,那么使用puts列表可能会有客户端缓冲区大小的问题。
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value>
</property>默认情况下,客户端最多收集2mb数据,然后将其刷新。因此,您还必须增加此值
发布于 2015-02-28 06:20:12
对于批处理but,最好先构造一个but列表,然后调用HTableInterface.put(List<Put> puts),因为它使用单个RPC调用来提交批处理,但根据列表的大小,写缓冲区可能会将其全部刷新,也可能不会
https://stackoverflow.com/questions/28754077
复制相似问题