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

时间:2016-01-13 09:20:41

标签: cassandra-2.0

我有2个节点的Cassandra集群。我的表结构是Statement select = QueryBuilder.select().all().from(tableName).where(QueryBuilder.containsKey("list", value)); select.setFetchSize(50000); 。我试图获取包含给定列表的所有密钥。我的查询看起来像

.attr("position", "fixed")

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

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

  1. 任何人都可以建议正确的方法来解决这个问题吗?
  2. 有这种问题可以选择吗?
  3. Cassandra版本= Cassandra 2.2.1

1 个答案:

答案 0 :(得分:1)

Cassandra数据建模最佳实践建议不要使用集合(列表,集合,映射)来存储大量数据。原因是当加载CQL行(SELECT ... WHERE id = xxx)时,Cassandra服务器必须在内存中加载整个集合。

现在回答你的问题:

  
      
  1. 任何人都可以建议正确的方法来解决这个问题吗?
  2.   

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

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

解决方案1:手动非规范化

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. 有这种问题可以选择吗?
  2.   

见上面第1点的答案:)