我正在处理一个批处理作业,通过HTableInterface处理一批Put对象到HBase。有两种API方法,HTableInterface.put(List)和HTableInterface.put(Put)。
我想知道,对于相同数量的Put对象,批处理的速度是否比逐个放置它们更快?
另一个问题是,我正在放置一个非常大的Put对象,导致作业失败。 Put对象的大小似乎有限制。它有多大?
答案 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
所以我认为第一个问题的答案是肯定的。
我会通过基准测试对其进行验证。