2013-10-01 85 views
2

如果HDFS不允許修改文件,HBase如何存儲和修改數據?由於結果主要面向HBase物理數據格式,因此很難搜索這個問題的答案。但我無法找到HBase如何解決HHDFS文件不可變的問題?HDFS如何修改數據

回答

5

HBase以索引形式將數據存儲在HDFS中。爲了簡化事物,HDFS文件將按照排序順序存儲密鑰,以便快速查找特定密鑰。 HBase數據存儲在RegionServers(RS)中處理。

在RS中,密鑰首先被寫入內存存儲(稱爲memstore)。 memstore存儲新的密鑰/更新刪除。經過一定的閾值後,這些密鑰將作爲新索引文件推送到HDFS。更新由時間戳處理 - 假定最新版本是唯一有效的版本。所以如果以前的索引文件具有相同的密鑰,它將被忽略。刪除與更新相同,唯一的區別是刪除有一個特殊的類型字段,其中有一個將該鍵標記爲已刪除的標誌。

我已經做了一些簡化:

  • 索引文件格式已經隨着時間的推移發生了很大變化。最初,它是MapFile。最新版本的HBase使用名爲HFile的格式,其中包含特定於HBase的元數據和優化。
  • 的寫操作都記錄在一個WAL(預寫日誌)磁盤,他們進入的memstore之前。這是爲了防止數據丟失。

我還發現了幾個優秀的相關的文章,你應該閱讀:

+0

非常感謝,這是真正的幫助,也感謝您的鏈接。 – user2833557

0

HBase的做了幾件事情(以下是簡化的,但它解釋了總體思路): 爲了保持一致性,它在數據到達時寫入WAL文件 - 因此數據沒有變化。

「問題」是與將數據存儲在一個有序的方式HFiles。 HBase解決這個問題的第一件事就是它將數據保存在內存中(每個區域的memstore),並且只有當它們被填充時纔將它們刷新到磁盤。這節省了一些重寫。

在保存之前等待只解決了一些問題,仍然存在需要重新排列數據的情況 - (例如,對同一個鍵等進行重複更新),所以HBase所做的第二件事是壓縮讀取多個HFile並創建與合併數據新的(並刪除舊文件)