2014-01-16 37 views
0

在Hbase中,我使用像'app_name_ip_timestamp'這樣的行鍵來加載數據。但是會有很多這樣的應用程序。所以本質上我每分鐘收集大約50k個數據點。Hbase行鍵過濾器,範圍掃描和cassandra能力

如果我必須基於ip查詢,我可以使用行鍵的子字符串過濾器,但這是一個好方法嗎? Can Cassandra可以幫忙嗎? Cassandra在這種情況下有什麼優勢? 如何使HBase適合於我可以使用行鍵子字符串過濾器並執行範圍掃描並以毫秒爲單位檢索結果的情況? 就是在即席查詢和部分行鍵,範圍掃描,彙總結果

回答

1

我不能談論卡桑德拉,所以我就回答您的問題與HBase的考慮方面查詢卡桑德拉和HBase的主要區別因爲這類問題在這裏被多次提出。您基本上需要一個二級索引,它並不直接支持HBase,請閱讀以下有關它的文檔:http://hbase.apache.org/book/secondary.indexes.html

現在,根據您的訪問模式,我會建議您手動雙寫入數據表和用作具有2種不同類型的行鍵的二級索引的表格;

[ip_as_long]-1-[timestamp]-[appname] 
[ip_as_long]-2-[appname]-[timestamp] 

該表只有一個系列,其中一列由數據表中數據點的rowkey組成。有了良好的緩衝區,您將不會遇到任何性能問題。

要查詢基於ip的數據,只需掃描索引表,設置起始行爲「[ip_as_long] -1-」以通過時間戳查詢,或者查詢爲「[ip_as_long] -2- [appname]」來查詢由應用程序名稱。該掃描將爲您提供可用於執行multiget到數據表以檢索它的rowkeys。

考慮到這種方法,您可以使用另一個輔助索引表,其中應用程序名稱爲主要維度,因此您還可以通過「[appname] - [timestamp]」查詢數據。

建議:如果您有足夠的存儲空間,而不是將rowkey寫入索引,那麼我只需寫入整個數據本身,這樣就可以避免執行multiget。

+0

如果我維護兩個表,其中不同形式的相同行鍵映射到一個uid和另一個表,其中uid_timestamp存儲鍵值對,那麼我的表現如何? –

+0

如果您執行返回幾行的查詢(因爲從索引讀取數據後需要額外的multiget),那將會非常好。在索引表中存儲數據表的行鍵對於大型掃描來說不會很好。如果您需要對索引表執行大型掃描,請堅持我提到的建議,它會更快:將所有數據存儲在索引表中而不是rowkey中,您將有數據重複(將相同的列存儲在兩個表),但是你不應該害怕這個,當你使用HBase時,這是一種常見的方法。 –