Cassandra 无法从表中查询行总和

Posted

技术标签:

【中文标题】Cassandra 无法从表中查询行总和【英文标题】:Cassandra unable to query sum of rows from a table 【发布时间】:2019-10-13 14:41:21 【问题描述】:

我正在使用Cassandra数据库捕获并保存一个简单的网络嗅探器数据,但是由于表中的行数大于20M+行,因此无法运行sumcount等任何聚合函数.

以下是我的表架构:

CREATE TABLE db.uinfo (
    id timeuuid,
    created timestamp,
    dst_ip text,
    dst_mac text,
    dst_port int,
    protocol int,
    src_ip text,
    src_mac text,
    src_port int,
    PRIMARY KEY (id, created)
) WITH CLUSTERING ORDER BY (created ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = 'keys': 'ALL', 'rows_per_partition': 'NONE'
    AND comment = ''
    AND compaction = 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'
    AND compression = 'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

现在当我运行查询时(有或无限制):

select src_ip, sum(data) as total from db.uinfo;

它抛出了以下错误:

OperationTimedOut: errors='127.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)', last_host=127.0.0.1

你们中的任何一个好人都可以帮助我做同样的事情吗?我尝试分别更改cqlshrccassandra.yaml 中的超时。我什至尝试使用以下方法启动 cqlsh:

cqlsh --connect-timeout=120 --request-timeout=120

我正在使用[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]

【问题讨论】:

【参考方案1】:

当 Cassandra 中有相对较大的数据时,这种查询将无法使用 - 这种查询需要扫描整个数据库,并读取其中的所有数据。当您知道要访问的分区时,Cassandra 非常棒,因此,仅将查询发送到可以非常有效地处理它们的单个服务器。所以聚合函数只在分区内工作得最好。

如果您需要完成此类查询 - 常见的建议是使用 Spark 并行读取数据并执行聚合。您可以使用Spark Cassandra Connector 执行此操作,但它会比普通查询慢 - 可能需要几十秒甚至几分钟,具体取决于数据大小、Spark 作业的硬件等。

如果您需要经常执行此类查询,那么您需要寻找其他技术,但很难说在这种情况下谁会表现出色。

【讨论】:

以上是关于Cassandra 无法从表中查询行总和的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

在笔记本上使用 pyspark 从表中删除行

从表中选择行,使其列的计算值总和小于给定限制

从表中返回加起来达到最大给定值的项目

Cassandra 更新无法正常工作

如何将所有行的两列总和为第三列