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