2013-05-06 33 views
3

我建議這應該是常見的情況之一,但可能在搜索時使用錯誤的關鍵字。HBase:原子'檢查行不存在,並創建'操作

我只需要用完全隨機的密鑰創建新的表記錄。假設我獲得了具有良好隨機性的密鑰(幾乎是隨機的)。然而,我不能100%確定沒有行存在。所以我需要做什麼原子:

  • 有行鍵檢查沒有行還存在。
  • 如果存在行,則拒絕操作。
  • 如果沒有退出,則創建行。

最有用的信息的一塊,我對這個話題發現是一篇關於HBase row locks. 我看到HBase的行鎖作爲合適的解決方案,但我想這樣做沒有明確的行鎖定更好的辦法。

  • ICV看起來不合適,因爲我確實希望密鑰是隨機的。
  • 如果CAS能處理'行不存在'的情況,CAS會很好,但看起來他們不行。
  • 顯式行鎖具有類似於區域拆分問題的缺點。

請問有人請加點有用的建議嗎? 最好的API是基於Java的,但實際上它更多是關於概念而不是實現。

+1

這可能是HBase開發或用戶列表的一個很好的問題:http://hbase.apache.org/mail-lists.html – 2013-05-06 14:19:44

回答

8

這個案例的'夠用'解決方案恰巧基於checkAndPut() method。我打算做的是新行插入與關鍵的重複檢查和單個刀片解決方案是完美的:

  • HTable checkAndPut()方法可以檢查某些列未設置(檢查是否有null值)。
  • 由於行無論如何都包含一些'ID'字段,它對於所有對象(您可以使用您始終爲您的 對象設置的任何其他字段)強制使用,因此可以檢查行是否存在。
  • Put傳遞給checkAndPut()的對象將包含帶有必需字段集的初始 對象狀態。

那麼,對於批量插入(我真的需要)它碰巧太慢了,所以我轉移到用作行鍵的UUID,而沒有對新行插入進行任何檢查。對我來說,它好多了。在這種情況下唯一考慮的是真正好的隨機生成器。標準的Java java.util.UUID類包含我需要的一切,包括它基於有點慢但相當強大的java.security.SecureRandom生成器。

請注意:看起來HBase用戶行鎖定功能將由於與其使用相關的安全/其他風險而被丟棄。