2013-10-24 41 views
0

我有一個程序,做了一些相當密集的計算,我想將這些計算結果緩存在卡桑德拉表中。什麼是最好的模式來做到這一點?卡桑德拉模式緩存應用程序數據

目前,我使用下面的架構:

CREATE TABLE raw_data_cache (
    id uuid, 
    buckets int, 
    start_time timestamp, 
    end_time timestamp, 
    time timestamp, 
    data list<float>, 
    PRIMARY KEY(id,buckets,start_time,end_time,time) 
) with GC_Grace_Seconds=1; 

id是數據源的ID,並bucketsstart_timeend_time正在處理參數。 Time是每列唯一的「關鍵」。 data是時間序列數據值。

將數據插入我使用的是標準的插入與超時沿表:

INSERT INTO raw_data_cache (id,buckets,start_time,end_time,time,data) VALUES 
(?,?,?,?,?,?) USING TTL 360; 

這種模式的問題是,我最終得到一致的讀取超時,我認爲這是由於數墓碑:Read 0 live and 3777400 tombstoned cells(取自「在cqlsh中追蹤」)。

我可以通過使用nodetool擺脫所有這些,但我不想每隔幾分鐘就這樣做。有沒有更好的架構或用法可以改善這種情況?

編輯raw_data_cache是用於存儲的raw_data經處理版本的表。我遵循了存儲raw_data的傳統知識,除了list<floats>(但是這是因爲我每次都有幾個不同的輸入,我希望一次都得到它們)。這裏的基本時間序列:

CREATE TABLE raw_data(
    id uuid, 
    time timestamp, 
    data list<float>, 
    PRIMARY KEY (id, time) 
); 

我與raw_data_cache目標是節省raw_data較小,處理後的版本了幾個小時。

回答

2

我不認爲你的數據模型是真的爲這種用法進行了優化。我在想,你應該使用更多的時間序列。使用您想要緩存的每個時間段的列。我不是100%確定,但認爲GC_Grace_Seconds = 1可能不是你真正想要的。

這是卡桑德拉數據建模的最佳資源之一:http://planetcassandra.org/blog/post/getting-started-with-time-series-data-modeling。此外,同一作者還有3個關於該主題的視頻。

如果你想優化得到的最新項目首先,你可以這樣做:

CREATE TABLE raw_data(
    id uuid, 
    time timestamp, 
    data list<float>, 
    PRIMARY KEY (id, time) 
) WITH CLUSTERING ORDER BY (event_time DESC); 

這將首先使最近的事件,這有助於在緩存中。如果你想以小時爲基礎的水桶。你可以做與之前在包含小時'2013-10-27 12'的日期範例中完全相同的技巧,並且它會在那個桶中包含所有的小時。因此,也許你可以嘗試這樣的:

CREATE TABLE summarized_data_cache(
    id uuid, 
    time_bucket text, 
    time timestamp, 
    data list<float>, 
    PRIMARY KEY ((id, time_bucket), time) 
); 

這將是快寫,但也快速檢索,因爲一切都將被存儲在一個寬行。

+0

我在關於上下文的問題中添加了更多信息。 raw_data_cache(或等效)需要存儲raw_data的處理版本,該版本根據您共享的鏈接建模。謝謝! – srlm

+0

嗯。感謝(())主鍵結構。這似乎削減了20%左右的閱讀時間。就特殊情況而言,這種分裂是任意的(不分小時或分或秒),所以我不能預先分解它。並且整個緩存(對於特定的主鍵)總是一次被讀取。 – srlm