读取查询期间的 Cassandra 超时(1900 万结果)一致性为 ONE

Cassandra timeout during read query (19 million result) at consistency ONE

我有 2 个节点的 Cassandra 集群。而我的 table 结构是 <key, Map<list, timestamp>>。我正在尝试获取包含给定列表的所有密钥。我的查询看起来像

Statement select = QueryBuilder.select().all().from(tableName).where(QueryBuilder.containsKey("list", value)); select.setFetchSize(50000);

但我在读取查询期间遇到 cassandra 超时。

我可以减少 setFetchSize 但是处理 1900 万行需要花费太多时间。

  1. 任何人都可以提出解决此问题的正确方法吗?
  2. 对于此类问题,是否有任何替代方案?

Cassandra 版本 = Cassandra 2.2.1

Cassandra 数据建模最佳实践建议不要使用集合(list、set、map)来存储海量数据。原因是当加载 CQL 行 (SELECT ... WHERE id=xxx) 时,Cassandra 服务器必须在内存中加载 entire 集合。

现在回答你的问题:

  1. Can any one please suggest correct way to solve this problem?

使用二级索引检索庞大的数据集(1900 万)并不是解决您的问题的最佳方法。

如果您的要求是:给我所有包含一个项目的列表,以下模式可能更合适

解决方案一:手动反规范化

CREATE TABLE base_table(
   id text,
   key int,
   value timestamp,
   PRIMARY KEY(id, key)
);

CREATE TABLE denormalized_table_for_searching(
  key int,
  id text
  value timestamp,
  PRIMARY KEY(key, id));

// Give me all couples (id,value) where key = xxx
// Use iterator to fetch data by page and not load 19 millions row at once !!
SELECT * FROM denormalized_table_for_searching WHERE key=xxx; 

解决方案 2:使用 Cassandra 3.0 物化视图自动反规范化

CREATE TABLE base_table(
   id text,
   key int,
   value timestamp,
   PRIMARY KEY(id, key)
);

CREATE MATERIALIZED VIEW denormalized_table_for_searching
AS SELECT * FROM base_table
WHERE id IS NOT NULL AND key IS NOT NULL
PRIMARY KEY(key, id);

// Give me all couples (id,value) where key = xxx
// Use iterator to fetch data by page and not load 19 millions row at once !!
SELECT * FROM denormalized_table_for_searching WHERE key=xxx; 
  1. is there any alternative available for this kind of problem?

请参阅上面第 1 点的答案:)