san*_*oid 2 java performance hadoop hbase mapreduce
所以情况就是这样:我创建了一个SetWritable类,它基本上是java.util.Set的包装器,它实现了Writable接口.我有一个HBase表,其中包含一个列族和一列,该列的值是序列化的SetWritable对象.现在,如果我想在集合中添加一个元素,我需要从HBase中提取行,将其反序列化为SetWritable,添加我的元素,序列化SetWritable,然后将其推回HBase.所以这意味着我的映射器和HBase之间有很多通信.由于我正在处理大量数据,这可能会导致我的性能下降.
我想做的只是将新元素发送到HBase,并在HBase服务器上放置一些反序列化SetWritable的代码,添加元素,序列化SetWritable,然后提交它.这可能吗?协处理器能帮忙吗?
另一个想法:我可以为集合中的每个已知元素添加一列,而不是将我的集合序列化为一列.一个缺点:我可能会收集数十万(或数百万)列.这是一个问题吗?
本地或远程序列化不是正确的方法.使用列限定符来存储您的值,您就可以获得所需的行为.
如果使用列限定符作为set元素,则hbase可以稀疏地存储集合.也就是说,你可以在一组中拥有一百万个元素; 另一套具有不相交的百万元素.HBase只能存储200万件物品.
添加或删除set元素很简单:add是put(键,列,列限定符),remove是delete(键,列,列限定符).要检索整个集合,您只需迭代行中的值即可.
修改这种方法以使用计数而不是二进制成员资格甚至难以实现 - 您只需使用原子增量指令:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable的.html#增量%28org.apache.hadoop.hbase.client.Increment 29%
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |