0

我有一个程序可以进行一些相当密集的计算,我想将这些计算的结果缓存在 Cassandra 表中。这样做的最佳模式是什么?

目前,我正在使用以下架构:

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_time、 和end_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_dataraw_data除了 a list<floats>(但那是因为我每次有几个不同的输入,我想一次得到所有输入),我在 storage 中遵循了似乎是传统的智慧。这是基本时间序列:

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

我的目标raw_data_cache是保存一个较小的、经过处理的 raw_data 版本几个小时。

4

1 回答 1

2

我不认为您的数据模型真的针对这种用法进行了优化。我认为您应该使用更多基于时间序列的方法。包含要缓存的每个时间段的列。我不是 100% 确定,但认为 GC_Grace_Seconds=1 可能不是你真正想要的。

这是 Cassandra 数据建模的最佳资源之一: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)
);

这样写起来会很快,但检索起来也很快,因为所有内容都将存储在一个宽行中。

于 2013-10-27T00:59:23.847 回答