java - 在 HBase 中存储和更新 Set 的最佳方式是什么?

标签 java performance hadoop mapreduce hbase

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

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

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

最佳答案

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

如果您使用列限定符作为您的集合元素,那么 hbase 可以稀疏地存储您的集合。 IE。您可以在一组中包含一百万个元素;另一组具有不相交的百万元素。 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

关于java - 在 HBase 中存储和更新 Set 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418848/

相关文章:

java - 使用 ED25519 key 和 Bouncy CaSTLe (Java) 签名/验证 Json

c# - 首先在需要两者的 IEnumerable 上排序或删除全部?

php - WordPress 选择计数查询优化

java - 在 Spring Security 中获取访问 token

java - 如何交换 ArrayList 中两个对象的位置?

hadoop - Flume 将 txt 文件转换为二进制文件

java - Hadoop 和 MapReduce

hadoop - LeaseExpiredException关于Spark中的动态分区

java - 如何发送文件目录

python - 映射对角线