Cassandra:插入值并更新 average/min/max
Cassandra: insert value and update average/min/max
我正在考虑在 Java 应用程序中使用 Cassandra 处理时间序列数据。我还需要最后 n 分钟的平均值(和 min/max)。
简单的方法是从客户端进行三个调用:
- 插入新值
- select 最近 n 分钟的平均值、最小值和最大值
- 更新平均值
有没有更有效的方法来做到这一点?
第一步和第二步使用相同的分区,因此将 运行 在同一节点上。因此,如果可以在同一请求中执行两个语句,则可以节省往返行程。但是BATCH不支持select(据我了解)。
第三个请求涉及不同的分区(因此可能是不同的节点)。使用 BATCH 的好处是两个表保持同步。而且我认为它还可以节省客户端 -> 协调器的往返行程。但是 BATCH 不支持将结果从 select 传递到更新(据我所知)。
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);
有一个 avg
、min
和 max
聚合函数(从 2.2 开始)。所以你真的不需要 table ,你可以查询它。由于按 recorded_at
排序,数据将在磁盘或 memtables 中按顺序排列
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) 但现在你必须手动计算并将 "half hour ago" 值放入。
我强烈建议避免使用 BATCH 并为此更新第二个 table,并在需要时让查询读取值。如果您担心上述查询的性能,请在进行优化之前对其进行测试,这很可能会更加昂贵。如果您需要 "average for past day" 之类的东西,那可能是值得的,但我不会将其作为您更新的一部分,而是更像是 "every minute update" 之类的东西(也可以考虑 spark streaming)
我正在考虑在 Java 应用程序中使用 Cassandra 处理时间序列数据。我还需要最后 n 分钟的平均值(和 min/max)。
简单的方法是从客户端进行三个调用:
- 插入新值
- select 最近 n 分钟的平均值、最小值和最大值
- 更新平均值
有没有更有效的方法来做到这一点?
第一步和第二步使用相同的分区,因此将 运行 在同一节点上。因此,如果可以在同一请求中执行两个语句,则可以节省往返行程。但是BATCH不支持select(据我了解)。
第三个请求涉及不同的分区(因此可能是不同的节点)。使用 BATCH 的好处是两个表保持同步。而且我认为它还可以节省客户端 -> 协调器的往返行程。但是 BATCH 不支持将结果从 select 传递到更新(据我所知)。
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);
有一个 avg
、min
和 max
聚合函数(从 2.2 开始)。所以你真的不需要 table ,你可以查询它。由于按 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) 但现在你必须手动计算并将 "half hour ago" 值放入。
我强烈建议避免使用 BATCH 并为此更新第二个 table,并在需要时让查询读取值。如果您担心上述查询的性能,请在进行优化之前对其进行测试,这很可能会更加昂贵。如果您需要 "average for past day" 之类的东西,那可能是值得的,但我不会将其作为您更新的一部分,而是更像是 "every minute update" 之类的东西(也可以考虑 spark streaming)