【问题标题】:Cassandra: insert value and update average/min/maxCassandra:插入值并更新平均值/最小值/最大值
【发布时间】:2017-02-27 01:41:50
【问题描述】:

我正在考虑在 Java 应用程序中使用 Cassandra 处理时间序列数据。我还需要最后 n 分钟的平均值(和最小值/最大值)。

简单的方法是从客户端进行三个调用:

  1. 插入新值
  2. 选择最近 n 分钟的平均值、最小值和最大值
  3. 更新平均值

有没有更有效的方法来做到这一点?

第一步和第二步使用同一个分区,因此将在同一个节点上运行。因此,如果两个语句都可以在同一个请求中执行,则可以节省往返行程。但 BATCH 不支持选择(据我了解)。

第三个请求涉及不同的分区(因此可能涉及不同的节点)。使用 BATCH 的好处是两个表保持同步。而且我认为它还可以节省客户 -> 协调员往返行程。但是 BATCH 不支持将结果从选择传递到更新(据我所知)。

create table metrics (
  resource_name text,
  metric_name text,
  recorded_at timestamp,
  value double,
  primary key ((resource_name, metric_name), recorded_at)
) with clustering order by (recorded_at desc);

create table last_30m (
  metric_name text,
  resource_name text,
  avg_value double,
  min_value double,
  max_value double,
  primary key (metric_name, resource_name)
) with clustering order by (resource_name asc);

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    有一个 avgminmax 聚合函数(截至 2.2)。所以你真的不需要一个表,你可以查询它。由于按recorded_at 排序,因此数据在磁盘或内存表中都是连续的

    SELECT avg(value), min(value), max(value) FROM metrics WHERE resource_name = 'blarg' AND metric_name = 'cpu' AND recorded_at > {half hour ago}

    将来会有一个now()-30m (CASSANDRA-11936),但现在您必须手动计算并输入“半小时前”的值。

    我强烈建议避免使用 BATCH 并为此更新第二个表,并在需要时进行查询以读取值。如果您担心上述查询的性能,请在进行可能更昂贵的优化之前对其进行测试。如果您需要诸如“过去一天的平均值”之类的东西,那可能是值得的,但我不会将其作为您更新的一部分,而是更像是“每分钟更新”之类的事情(也可以考虑火花流)

    【讨论】:

    • 感谢您的回复。我将首先对其进行测试以评估性能。
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2016-12-29
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多