3

所以情况如下:我创建了一个 SetWritable 类,基本上是实现 Writable 接口的 java.util.Set 的包装器。我有一个包含一列族和一列的 HBase 表,并且该列的值是序列化的 SetWritable 对象。现在,如果我想向集合中添加一个元素,我需要从 HBase 中提取行,将其反序列化为 SetWritable,添加我的元素,序列化 SetWritable,然后将其推回 HBase。所以这意味着我的映射器和 HBase 之间有很多很多的通信。鉴于我正在处理大量数据,这可能会影响我的表现。

我想做的只是将新元素发送到 HBase,并在 HBase 服务器上有一些代码反序列化 SetWritable,添加元素,序列化 SetWritable,然后提交它。这可能吗?协处理器可以提供帮助吗?

另一个想法:不是将我的集合序列化为一列,我可以为集合的每个已知元素设置一列。一个缺点:我可能会得到数十万(或数百万)列。这是一个问题吗?

4

1 回答 1

6

本地或远程序列化不是正确的方法。使用列限定符来存储您的值,您将获得您想要的行为。

如果您使用列限定符作为您的集合元素,那么 hbase 可以稀疏地存储您的集合。即你可以在一个集合中有一百万个元素;另一个具有不相交的百万元素的集合。HBase 只能存储 200 万个项目。

添加或删除集合元素很容易:添加是 put(key, column, column qualifier),删除是 delete (key, column, column qualifier)。要检索整个集合,您只需迭代行中的值。

修改这种方法以使用计数而不是二进制成员资格甚至不是那么困难——您只需使用原子增量指令:http ://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable .html#increment%28org.apache.hadoop.hbase.client.Increment%29

于 2012-05-02T23:35:41.393 回答