2012-05-25 99 views
1

我想知道如何在Hadoop/HDFS/Hbase中對數據進行版本化。它應該是你的模型的一部分,因爲很可能發生變化(大數據是長時間收集的)。數據版本(Hadoop,HDFS,Hbase後端)

HDFS(基於文件的後端)的主要示例。

採樣登錄file.log

timestamp x1 y1 z1 ... 
timestamp x2 y2 z2 ... 

我現在不知道在哪裏添加的版本信息。我看到2種選擇:

文件格式內的版本

日誌file.log


timestamp V1 x1 y1 z1 ... 
timestamp V2 w1 x2 y2 z1 ... 
 

內部文件的名稱版本

*登錄file_V1.log *

 

timestamp x1 y1 z1 ... 
 

* log-file_V2.log *

timestamp w1 x1 y1 z1 ... 

第二個選項(文件名中的版本)對我來說感覺有點乾淨,適合於HDFS(我可以簡單地使用* _v2 *作爲模式來排除舊版本的文件)。另一方面,我將需要運行2個不同的工作,因爲我無法分析單個作業中的版本代碼段。我猜HBase中的版本會在另一個表列(HDFS是實現細節並用作HBase的後端)中定義結束嗎??????????????????????????????

爲後端Hadoop/HDFS/HBase版本化數據的其他替代方法?

謝謝!

編輯:我的問題是有關如何處理版本信息本身,而不是時間戳。

回答

0

在我看來,高效的數據版本化要求在相近的地方存儲相同版本的記錄。然後,您可以選擇合適的邏輯來根據需要選擇正確的版本。它與一些關係數據庫正在做的相似。
這種方法可能會被CoachDB使用,儘管我不是100%確定的。
現在讓我們看看HDFS/HBase。由於HBase允許數據突變和編輯,而HDFS則不允許,所以它們與此角度完全不同。
因此,對於HBase,您可以將timestemp作爲密鑰的最後一部分,並且所有版本都將在一起
HDFS適用於存儲少量大文件,我們無法編輯它們。我建議按照它們到達的順序將所有版本寫入文件,並使用MapReduce將所有版本的記錄與不同的時間戳一起編組在一起。這樣做效率不高,因爲所有數據都會通過混洗,但是您將會掌控。爲了解決這個問題,我們可以定期做這個分辨率,並在一個版本中存儲大多數記錄的數據。

2

對於HDFS,在文件中存儲時間戳使用更多的空間(timstamp每行重複一次),但可讓您靈活地在單個文件中保存多個日期。哪一個更好取決於你的用例。對於HBase,您有幾個選擇:您可以在行鍵中顯式包含時間戳(和/或版本號),並將不同版本的數據項設置到表中的不同行中;或者,您可以使用HBase的內置時間維度,它實際上包含數據庫中每個單元格的時間戳(即每行每列中的每個值),並允許您保持可配置數量的版本。默認情況下,掃描僅返回每個鍵/值的最新版本,但您可以在掃描時更改該行爲以返回多個版本,或者只返回給定時間範圍內的版本。

+0

感謝您提供有關時間戳的有用提示,但您將如何處理版本信息?時間戳和版本信息之間存在某種關係 - >更新版本的更新時間戳,但本身的版本信息與時間戳解耦 –