2013-06-12 31 views
0

我有以下的情況下使用:哪種方法和數據庫的性能關鍵的解決方案

  • 圍繞設備7000萬發出一個信號,每3〜5分鐘,以 服務器發送其ID,狀態(在線或離線),IP,位置 (經度和緯度),父節點和一些其他信息。

  • 其他信息可能不是標準格式(對我來說沒有模式),但我仍然需要查詢它。

  • 設備可能會消失一段時間(或永遠)不發送 信號的過程中。所以如果 他們在最近X天沒有發出信號,我需要一種方法來「忘記」設備。新設備 可能隨時上線。

  • 我需要查詢所有這些數據。就像知道有多少設備在特定區域或在IP範圍內離線一樣。不會有很多查詢在同一時間運行。

  • 某些查詢需要在數據庫更新的同時快速運行(每個查詢小於3分鐘)和 。所以我需要索引 的主要屬性(id,狀態,IP,位置和父節點)。 查詢結果不需要100%準確,只要不會花費太長時間(超過20分鐘的查詢結果),它們纔會出現在查詢結果中,因此最終一致性 都可以。

  • 我根本不需要 持久性,如果電源熄滅它可以丟失 的一切。

考慮到這一切我想用一個NoSQL的方法也許MongoDB的或CouchDB的,因爲我有一個MapReduce的和Javascript經驗,但我不知道哪一個是我的問題更好的(我對引力CouchDB的)或者他們是否適合處理這種巨大的工作量。我甚至不知道我是否真的需要一個「傳統」數據庫,因爲我不需要持久化磁盤(也許主內存方法會更好?),但是我確實需要一種輕鬆構建自定義查詢的方法。

我發現的主要問題有以下幾點:

  • 需要插入/更新大量的元組的真快,我不知道 事先如果我收到的信號已經在數據庫或不。 幾乎所有的信號都會與上次的 處於相同的狀態,所以也許可以通過id查詢,並檢查元組是否更改,如果不更新?

  • 切換離線設備。在夜間運行的批處理作業將刪除過期的元組將解決此問題。

  • 不會有很多查詢在同一時間運行,但它們需要 才能快速運行。所以我想我需要一個集羣在集羣的多個節點上執行單個查詢(CouchDB MapReduce 是否將工作負載拆分到集羣的多個節點?)。我不是 腸衣肯定我需要一個集羣雖然,可以單個更昂貴的機器處理所有的負載?

  • 我從來沒有使用過一個noSQL系統,但我對這個問題有了理論上的瞭解 。

回答

1

這是否有意義?

Apache Flume用於收集信號。

它是分佈式的,可靠的,並且可用於有效地收集,聚集和來自許多不同來源移動大量的日誌數據到集中式數據存儲系統。易於配置和擴展。使用Flume將數據作爲文件存儲在HDFS中。

Hive批量查詢。

將HDFS中的數據文件映射爲Hive倉庫中的外部表。無論何時需要離線批處理,都可以使用HiveQL編寫SQL查詢。

HBase隨機實時讀/寫。

由於HDFS,作爲一個FS,缺乏隨機讀/寫功能,您將需要一個數據庫來達到這一目的。看看你的用例HBase對我來說似乎很好。我不會說MongoDB或CouchDB,因爲你在這裏沒有處理文檔,並且這些都是面向文檔的數據庫。

Impala快速,交互查詢。

黑斑羚允許您快速直接存儲在HDFS或HBase的數據運行,互動的SQL查詢。與Hive不同,它不使用MapReduce。它反而利用了MPP的強大功能,所以它對實時性很好。而且它很容易使用,因爲它使用相同的元數據,SQL語法(Hive SQL),ODBC驅動程序等作爲Hive。

HTH

0

根據分析的類型,CouchDB的,水槽的HBase的可能都是不錯的選擇。對於嚴格的數字「一次寫入」指標數據石墨是非常受歡迎的開源解決方案。