2011-07-31 53 views
7

考慮到HBase將每個列族存儲在單獨的HFile中,以及行可以跨越多個Column族的事實。 HBase如何確保跨越多個列族的行上的put/delete操作確實是原子操作?HBase如何保證行級原子性?

+0

據我所知,對於任何行操作(比如Put/Delete/checkAndPut),操作順序是append - > sync - > memstore。此外,每個KeyValue中都有一個時間戳,您可以在其中存儲多個版本的KeyValue對(由列家族的版本確定)。您還可以使用RowLock確保操作完全安全。 – frail

回答

6

無論該行可能有多少個列族,都會寫入該行,轉到一個區域服務器,然後該區域服務器將編輯寫入區域WAL(Hlog),然後寫入同步,那麼數據將被添加到memstore中,以便它被提供。然後 - 一旦memstore達到極限,memstore將被刷新到磁盤。如果區域服務器發生任何問題,並且它崩潰/死亡/拔出插頭,WAL可以通過以保持一切順利。欲瞭解更多血淋淋的細節,請參閱HBASE-2283Hbase Architecture 101

+0

謝謝你的鏈接。我實際上對HBase如何確保寫入所有HFile(如果在Put/Delete調用中觸及多個列系列時會涉及多個HFile)感興趣,它原子地發生。但就像你提到的那樣,由於該更新仍然可以從WAL中獲取,HBase可以保證其客戶的原子性。 –

+0

準確地說 - WAL用於解決多重hfile問題等等。 – cftarnas

1

儘管通過同時刷新所有列族,HBase仍然可以實現行級別的原子性。當最大的色譜柱系列達到配置的沖洗尺寸時,會觸發沖洗。還有一個額外的MemStore級別的時間戳,它允許爲MemStore讀取執行多版本併發控制,但對於寫入HFile的鍵/值不存在。切換到每列家庭刷新(提高效率的理想功能)需要將類似的時間戳添加到文件格式中。