【问题标题】:Sum aggregation for each columns in cassandracassandra中每列的总和聚合
【发布时间】:2018-05-22 10:42:45
【问题描述】:

我有一个如下所示的数据模型,

CREATE TABLE appstat.nodedata (
    nodeip text,
    timestamp timestamp,
    flashmode text,
    physicalusage int,
    readbw int,
    readiops int,
    totalcapacity int,
    writebw int,
    writeiops int,
    writelatency int,
    PRIMARY KEY (nodeip, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)

其中,nodeip - 主键和时间戳 - 聚类键(按降序排序以获得最新的),

此表中的示例数据,

SELECT * from nodedata WHERE nodeip = '172.30.56.60' LIMIT 2;

 nodeip       | timestamp                       | flashmode | physicalusage | readbw | readiops | totalcapacity | writebw | writeiops | writelatency
--------------+---------------------------------+-----------+---------------+--------+----------+---------------+---------+-----------+--------------
 172.30.56.60 | 2017-12-08 06:13:07.161000+0000 |       yes |            34 |     57 |       19 |            27 |       8 |        89 |           57
 172.30.56.60 | 2017-12-08 06:12:07.161000+0000 |       yes |            70 |      6 |       43 |            88 |      79 |        83 |           89

这是正确可用的,每当我需要获取统计信息时,我都可以使用如下分区键获取数据,

(上面的逻辑似乎和我之前的问题类似:Aggregation in Cassandra across partitions但期望不同

我为所有 4 个节点中每一分钟填充的每一列(如 readbw、延迟等)设置了值。

现在,如果我需要获取列的最大值(例如:readbw),可以使用以下查询,

SELECT max(readbw) FROM nodedata WHERE nodeip IN ('172.30.56.60','172.30.56.61','172.30.56.60','172.30.56.63') AND timestamp < 1512652272989 AND timestamp > 1512537899000;

1) 第一个问题:有没有办法在不使用 IN 查询的情况下对列的所有节点(readbw)执行 ma​​x 聚合?

2) 第二个问题:有没有办法在 Cassandra 中,每当我在节点 1、节点 2、节点 3 和节点 4 中插入数据时。 它需要聚合并存储在另一个表中。这样我将从聚合表中收集每列的聚合值。

如果我的任何观点不清楚,请告诉我。

谢谢,
哈利

【问题讨论】:

  • “所有节点”在您的情况下是常量(字面意思是所有节点)还是变量(例如,组成某些集群的节点,并且节点列表可能会更改)?
  • 节点列表会有所不同。无论复制因子如何,它都会有所作为吗?
  • 这与第一个问题有关 - IN 中的列表是不变的,或者不是 - 我考虑了如何调整架构。
  • IN查询使用会涉及到所有Cassandra节点(即)如果集群中有4个节点,那么IN查询会涉及到所有四个节点如'172.30.56.60','172.30.56.61 ','172.30.56.60','172.30.56.63'
  • 每个节点都有自己的统计信息,分区键作为其nodeIp,集群键作为其时间戳进行排序。注意:由于需要在每列的节点之间执行聚合,所以我没有简单的方法来做到这一点

标签: cassandra cassandra-3.0


【解决方案1】:

如果你是 dse Cassandra,你可以启用 spark 并编写聚合查询

【讨论】:

  • 谢谢,但是我无法添加apache spark,您认为我使用的数据模型是正确的选择吗?
【解决方案2】:

免责声明。在您的问题中,您应该定义对查询速度的限制。读者不知道您是想实时展示这一点,还是更多地用于分析目的。也不清楚您正在操作多少数据,答案可能取决于此。

首先决定是否要对读取或写入进行聚合。这在很大程度上取决于您的读/写模式。

1)第一个问题:(聚合阅读) 简短的回答是否定的——这是不可能的。如果您想为此使用 Cassandra,最好的方法是通过读取每个带有时间戳限制的 nodeip 在您的应用程序中进行聚合。那会很慢。但 Cassandra 聚合也可能很慢。存在此警告是有原因的:

Warnings :
Aggregation query used without partition key

我发现 C++ Cassandra 驱动程序是最快的选择,如果你喜欢的话。

如果您的数据大小允许,我会考虑使用其他数据库。常规的旧 MySQL 或 Postgres 可以很好地完成这项工作,除非你有 TB 的数据。如果您想要一个更具异国情调的数据库,还可以使用流入数据库。但我在这里跑题了。

2)第二个问题:(写聚合) 这是我使用了一段时间的方法。每当我需要一些聚合时,我都会在内存(redis)中完成它们,然后刷新到 Cassandra。请记住,Cassandra 在写入数据方面非常高效,不要害怕为您的聚合创建一些额外的表。我不能确切地说如何为您的数据执行此操作,因为这完全取决于您的要求。在写入聚合时提供任意时间戳间隔的结果似乎不可行。

只是不要尝试将大量数据放入单个分区中。那么你最好使用传统的 SQL 数据库。

【讨论】:

  • 请不要转移话题,无论如何回答你的问题,数据大小将每分钟有一个统计条目。我们将保留最近 3 个月的数据。现在您可以从 Cassandra 的角度提出您的观点了吗?
  • 看,我只是想弄清楚您是否使用了正确的工具来完成这项工作。 Cassandra 对某些事情有好处,但对其他事情则不然。那么您还没有回答我的任何问题:您希望查询完成多快?你总共有多少行?
  • 对不起,我在另一个问题中回答了,在这里错过了,这将是每分钟一个条目。所以每分钟一排
  • 另外你认为我使用的数据模型是一个正确的选择吗?
猜你喜欢
  • 2019-03-25
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多