2012-05-02 23 views
1

所以情况如下:我创建了一个SetWritable类,基本上是java.util.Set的封装器,它实现了Writable接口。我有一个有一列家族和一列的HBase表,该列的值是序列化的SetWritable对象。现在,如果我想添加一个元素到集合中,我需要从HBase中取出行,将它反序列化为SetWritable,添加我的元素,序列化SetWritable,然后将它推回到HBase。所以这意味着我的映射器和HBase之间的通信量很大。鉴于我正在处理大量数据,这可能会导致我的表现不佳。在HBase中存储和更新Set的最佳方式是什么?

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

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

回答

5

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

如果使用列限定符作为您的set元素,那么hbase可以稀疏地存储您的集合。即你可以在一组中有一百万个元素;另一组与不相交的万分之一。 HBase只会储存200万件物品。

要添加或删除集合元素将很容易:添加是一个put(键,列,列限定符),并且删除是删除(键,列,列限定符)。要检索整个集合,只需遍历行中的值即可。

它甚至不是很难修改这种方法使用次数,而不是二进制会员 - 你只需要使用单位递增指令:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html#increment%28org.apache.hadoop.hbase.client.Increment%29

+0

谢谢你,大卫。这正是我所需要的。然而,这引出了我的下一个问题:是否有一个列数百万列的问题?基本上,我需要为我的系统中的每个用户提供一列。 – sangfroid

+0

不确定你的意思是什么问题。 HBase数据稀疏,所以没有数据的列不占用空间。如果每行都有数百万列,那么您可能会遇到行数大于您所在地区的问题。但是,只要你有足够的内存来缓存你最大的行,你应该没问题。但是,找出最好的方法是测试它。 – David

相关问题