2015-05-20 196 views
3

我很新的大數據領域,目前正在通過一個基本決定。卡桑德拉查詢的靈活性

對於一個研究項目,我需要將每分鐘數百萬條日誌條目存儲到基於Cassandra的數據中心,這很好。 (單個數據中心,4個節點)

Log Entry 
------------------------------------------------------------------ 
| Timestamp    | IP1   | IP2   ... 
------------------------------------------------------------------ 
| 2015-01-01 01:05:01 | 10.10.10.1 | 192.10.10.1 ... 
------------------------------------------------------------------ 

每個日誌條目都有一個特定的時間戳。日誌條目應首先在不同時間範圍內查詢。按照推薦,我開始以大排方式「模擬我的查詢」。

Basic C* Schema 
------------------------------------------------------------------ 
| row key    | column key a   | column key b  ... 
------------------------------------------------------------------ 
| 2015-01-01 01:05 | 2015-01-01 01:05:01 | 2015-01-01 01:05:23 
------------------------------------------------------------------ 

附加細節: 列鍵是時間戳+ UUID,是唯一的,以避免重印的組合物; 特定時間的日誌條目通過其相同的分區鍵存儲在節點附近;

因此,日誌條目以每行的短時間間隔存儲。例如2015-01-01 01:05的每個日誌條目的精度爲一分鐘。查詢實際上並不是帶有<運算符的範圍查詢,而是將條目選作指定分鐘的塊。

基於範圍的查詢成功的體面響應時間對我來說很好。

問題: 在我們想通過查詢,這主要集中在IP領域獲得額外信息的下一個步驟。例如:選擇所有具有IP1=xx.xx.xx.xxIP2=yy.yy.yy.yy的條目。

因此很顯然,當前的模型對於其他以IP爲焦點的CQL查詢來說很不可用。所以問題不是找到可能的解決方案,而是可能的技術的各種選擇,這可能是一種可能的解決方案:

  1. 嘗試解決獨立C *解決方案的問題。 (生成的第二模型,並在不同的形狀給予相同的數據)
  2. 選擇火花等其他技術...
  3. 轉爲HDFS/Hadoop的 - 卡桑德拉/ Hadoop的溶液...

由於缺乏這方面的知識,很難找到我應該採取的最佳方式。特別是有人認爲集羣計算框架的使用是一個過度的解決方案。

+2

建議/建議是無關緊要的,但很難投票結束一個制定良好的問題。 – maasg

回答

2

當我明白你的問題,你的表結構是這樣的:

create table logs (
    minute timestamp, 
    id timeuuid, 
    ips list<string>, 
    message text, 
    primary key (minute,id) 
); 

有了這個簡單的模式,您可以:

  • 可以獲取所有日誌特定分鐘。
  • 可以獲取較短的日誌事件的分鐘範圍。
  • 想要通過IP查詢數據集。

從我的角度來看,也有實現這個想法的多種方式:

  • 創建IP地址的二級指標。但在C *中,您將失去按時間戳查詢的能力:C *無法合併主索引和二級索引(如mysql/pgsql)。
  • 反規格化數據。將您的日誌事件一次寫入兩個表,首先針對時間戳查詢進行優化(分鐘+ ts作爲PK),其次是針對基於IP的查詢(IP + ts作爲PK)。
  • 使用spark爲解析查詢。但是spark每次需要執行(完整的)表掃描(以一種漂亮的分佈式map-reduce方式,但仍然是表掃描)以提取所有請求的數據,因此所有查詢都需要大量的查詢完成時間。如果您打算擁有大量低延遲查詢,則這種方式可能會導致問題。
  • 使用ElasticSearch等外部索引進行查詢,C *用於存儲數據。

我認爲,C *做這種事情的方式是爲不同的查詢設置一組單獨的表。它將使您能夠執行極速查詢(但會增加存儲成本)。

+0

非常感謝您進行這項有用的調查。基本上你抓住了所有我一直擔心的問題和事實。正如您已經提到的,二級索引對我來說沒有選擇 - 不幸的是!我開始玩Spark,但你又是對的:沒有合理的限制,我必須查詢完整的表格,這不是一個很好的解決方案。建立第二個模型是正確的方法,問題是:寫入過程中可用的數據量和短時間段。有兩種不同的模型同時執行插入過程的原生方法嗎? – kn0x

+1

您可以使用[batchched](http://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html)語句同時寫入兩個表。如果您使用「LOGGED」批次,這些批次也可能表現得像輕量級交易。 – shutty

+0

謝謝!我會嘗試一下! – kn0x