【问题标题】:Storing terabyte of uniform time series in cassandra在 cassandra 中存储 TB 的统一时间序列
【发布时间】:2015-06-22 06:03:16
【问题描述】:

我想尽可能高效地存储大量时间序列。速度很重要,但不如存储重要。

我的数据由股票名称和 15 年的 1 分钟数据组成。 数据从 2000 年 1 月 1 日开始精确,每天的分钟数正好是 390 分钟。

所以我不需要存储每个系列的时间戳,因为我可以自动计算。
所以不要这样:

Apple [timeStamp:value][timeStamp:value]

我想要这个:

Apple [value][value]

有没有办法在 Cassandra 中加载这种数据,所以它只存储顺序值,而不是每个值的时间戳。

据推测,通过为每个系列使用时间戳会使所需的存储空间增加一倍:如果每个时间戳和值都是 8 字节,那么如果只存储值,它将占用 50 TB 而不是 25 TB。

【问题讨论】:

    标签: cassandra storage time-series


    【解决方案1】:

    Cassandra 具有列表类型,最多可存储 64K 元素。由于 15 年的分钟数超过 64K,因此您需要一些辅助键将其分解为 64K 或更小的组。

    假设您决定按天(每天 1440 分钟)存储它,那么您可以这样定义表格:

    CREATE TABLE stock_values_by_day (
      stock_name text,
      year int,
      day_number_within_year int,
      values list<int>,
      PRIMARY KEY (stock_name, year, day_number_within_year) );
    

    因此,股票名称将是分区键,而年份和日期将是集群列。

    然后,您将每天在列表字段中存储 1440 个数据点。因此,您不会为时间键使用太多空间,并且您可以每天查询每只股票的数据,还可以在一年内进行多天的范围查询。

    如何分解取决于访问数据时所需的粒度级别(例如每天、每月等)。

    另一种方法是将数据存储在 blob 字段中。在您的应用程序中,您会将数据(例如一年的值)编码为二进制 blob 并以这种方式保存。当您读出它时,您必须将二进制 blob 扩展回原始值数组。

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 2013-07-02
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多