带有 COUNT 查询的 Cassandra 超时

Posted

技术标签:

【中文标题】带有 COUNT 查询的 Cassandra 超时【英文标题】:Cassandra Timeout with COUNT query 【发布时间】:2019-09-28 04:39:57 【问题描述】:

注意:我有超过 15967908 条记录。我是新手 卡桑德拉。参考:Is there a way to effectively count rows of a very huge partition in Cassandra?

Coordinator node timed out waiting for replica nodes in Cassandra Datastax while insert data

嗨,朋友们,我正在寻找其他答案,但对我来说没有用。他们提到我们需要增加 cassandra.yaml 文件中的超时时间,但问题是我没有该文件。

我已经用 HomeBrew 安装了 Cassandra。以下是我目前在 MacBook 上运行的版本

cqlsh:cassandra_training> show version;
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]

当我这样做时

cqlsh:cassandra_training> select count(*) from access_point_logs;

然后得到以下错误

ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 1 responses." info='received_responses': 1, 'required_responses': 1, 'consistency': 'ONE'

我需要增加哪个文件的超时时间。因为我没有得到 cassandra.yaml 文件。

我的Cassandra安装路径如下

/usr/local/Cellar/cassandra/3.11.4

有没有办法统计记录数。

【问题讨论】:

您使用的是哪个 Cassandra 的 DSE 或 OSS? @Nama 我正在使用来自 apache 网站的开源,因为 Datastax 不支持新版本,我们需要升级到企业版。 【参考方案1】:

简而言之,答案是否定的。你不应该在没有指定任何键的情况下运行查询,因为这不是 Cassandra 的设计方式。

如果您只需要一次性号码,您可以使用nodetool tablestats 来完成。

nodetool tablestats cassandra_training.access_point_logs

在输出中查找“键数(估计)”。

上述命令将为您提供表中分区键的估计数量,因此这可能是也可能不是您要查找的内容。

如果您需要定期获取此数字,我通常会创建另一个计数器表并在您从另一个表中添加/删除记录时对其进行管理。

【讨论】:

nodetool tablestats 中 | 的语法无效 cassandra_training access_point_logs | grep "键数" 没有兄弟还是一样 @ChannaveerHakari 然后移除管道和它之后的所有东西。您应该会看到一条说明“分区数”的行,它将为您估计表数据中存在的分区键的数量。 更新答案以删除 grep。 @JimWright 非常感谢您的支持和帮助。【参考方案2】:

我解决了这个问题。在创建表时,我没有正确添加 Primary KeyCluster Key,因为它显示了这种错误。

之前我通过以下方式创建了一个表结构

create table access_point_logs (
    id bigint primary key,
    wd_number varchar,
    ip_address varchar,
    mac_address varchar,
    created_at timestamp,
    updated_at timestamp,
    access_point_id bigint
);

现在改成如下

create table access_point_logs(
    id bigint,
    wd_number varchar,
    ip_address varchar,
    mac_address varchar,
    created_at timestamp,
    updated_at timestamp,
    access_point_id bigint,
    primary key ((wd_number), created_at, mac_address)
) with clustering order by (created_at desc);

以防万一像我这样的新手我想添加以下定义和示例以了解什么是分区键和什么集群键

仔细观察下面的变化

primary key ((wd_number), created_at, mac_address);


Partition Key - wd_number

Cluster Key - created_at, mac_address

分区键 - 将数据存储在哪个特定节点中 集群。

Clustering Key - 主要用于对数据进行排序以及如何显示 获取数据时的默认顺序。

主键 - 可能是分区键 + 集群键的组合,或者 只是一个分区键

希望它可以帮助某人。如果有人有疑问,请随时开火。我会尽力回答这些。

【讨论】:

以上是关于带有 COUNT 查询的 Cassandra 超时的主要内容,如果未能解决你的问题,请参考以下文章

即使在超时 10 秒后,当查询超过 10,000 行的键时,Cassandra 也会超时

如何为 cassandra 设置读取请求超时

Cassandra优化之查询超时优化

在大数据集上计算cassandra超时中的查询

Cassandra java 查询性能 count(*) 或 all().size()

python cql 驱动程序 - cassandra.ReadTimeout -“操作超时 - 仅收到 1 个响应。”