2012-05-02 50 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

相關問題