HBase批量放置(List <put>)比put(Put)快吗? Put对象的容量是多少?</put>

时间:2015-02-26 22:33:13

标签: hbase

我正在处理一个批处理作业,通过HTableInterface处理一批Put对象到HBase。有两种API方法,HTableInterface.put(List)和HTableInterface.put(Put)。

我想知道,对于相同数量的Put对象,批处理的速度是否比逐个放置它们更快?

另一个问题是,我正在放置一个非常大的Put对象,导致作业失败。 Put对象的大小似乎有限制。它有多大?

5 个答案:

答案 0 :(得分:2)

如果您的键值大小很大,那么使用puts列表可能会遇到客户端缓冲区大小问题。

<property>   
    <name>hbase.client.write.buffer</name>
    <value>20971520</value> 
</property>

默认情况下,客户端会收集最多2mb的数据,然后将其刷新。所以你还必须增加这个值

答案 1 :(得分:2)

引擎盖下的

put(List<Put> puts)put(Put aPut)是相同的。他们都打电话给doPut(List<Put> puts)

重要的是@ozhang提到的缓冲区大小。例如默认值为2MB。

<property>   
     <name>hbase.client.write.buffer</name>
     <value>20971520</value> 
</property>

每次写入缓冲区填满并触发flushCommits()时,将有1个RPC。因此,如果您的应用程序经常因为您的对象相对较大而进行刷新,那么尝试增加写入缓冲区大小将解决问题。

答案 2 :(得分:1)

对于批处理,如果构造一个puts列表然后调用HTableInterface.put(List<Put> puts)会更好,因为它使用单个RPC调用来提交批处理,但是根据列表的大小,写入缓冲区可以将其全部清除或者不

答案 3 :(得分:1)

通过使用put(List puts)方法,您肯定会节省多个RPC请求的开销。

关于非常大的Put对象:默认情况下,最大KeyValue大小为10MB。我认为你必须增加它来存储更​​大的KeyValue对象。

hbase.client.keyvalue.maxsize

指定KeyValue实例的组合最大允许大小。这是为存储在存储文件中的单个条目设置上限。由于它们不能被拆分,因此有助于避免因为数据太大而无法进一步拆分区域。将其设置为最大区域大小的一小部分似乎是明智的。将其设置为零或更小会禁用检查。

默认值:10485760

答案 4 :(得分:0)

请注意,这已弃用

  

把(列表<放>̶提出)̶或PUT(放̶a̶P̶u̶t̶)̶是相同的下̶h̶o̶o̶d̶.̶它们都呼叫̶d̶o̶P̶u̶t̶(列表<放>̶提出)

现在有新的工具。 org.apache.hadoop.hbase.client.AsyncRequestFutureImpl.SingleServerRequestRunnable#run MultiServerCallable

  

可处理针对单个区域服务器的多方法调用的Callable

所以我认为第一个问题的答案是肯定的。

我会通过基准测试对其进行验证。