在 Cassandra 中从大 table 变慢 Select

Slow Select from big table in Cassandra

我在 Cassandra(2.1.15.1423) 中有这样的 table 超过 14 000 000 条记录:

CREATE TABLE keyspace.table (
    field1 text,
    field2 text,
    field3 text,
    field4 uuid,
    field5 map<text, text>,
    field6 list<text>,
    field7 text,
    field8 list<text>,
    field9 list<text>,
    field10 text,
    field11 list<text>,
    field12 text,
    field13 text,
    field14 text,
    field15 list<frozen<user_defined_type>>,
    field16 text,
    field17 text,
    field18 text,
    field19 text,
    PRIMARY KEY ((field1, field2, field3) field4)
) WITH 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'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    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 = '99.0PERCENTILE';

在应用程序中我使用 Python (cassandra-driver==3.1.1) 和 Go (gocql)。

问题:

我需要将记录从这个 table 移到另一个。 当我尝试获取数据(即使没有过滤器)时,所有数据都停止并且出现超时错误。 我尝试更改 fetch_size/page_size - 结果相同,但在等待几分钟后。

如果您要将记录从这个 table 移动到另一个 table,您应该一次只做一个分区范围。做类似于 a

的事情
SELECT * FROM keyspace.table

不适用于 Cassandra 等高度分布式数据存储。这是因为像上面这样的查询需要完整的集群扫描和执行 scatter/gather 操作才能满足它。这是 C* 中的反模式,在大多数情况下会导致超时。一种更好的方法是一次只查询一个分区。数据存储可以非常快速地检索此数据。这种操作的常见模式是一次遍历 table 的标记范围并处理每个 individually.Here 是一个示例(抱歉它在 Java 中)如何在 Cassandra 中分割标记范围以一次只处理一小部分数据:

https://github.com/brianmhess/cassandra-count