读取查询期间的 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 万行需要花费太多时间。
- 任何人都可以提出解决此问题的正确方法吗?
- 对于此类问题,是否有任何替代方案?
Cassandra 版本 = Cassandra 2.2.1
Cassandra 数据建模最佳实践建议不要使用集合(list、set、map)来存储海量数据。原因是当加载 CQL 行 (SELECT ... WHERE id=xxx) 时,Cassandra 服务器必须在内存中加载 entire 集合。
现在回答你的问题:
- 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;
- is there any alternative available for this kind of problem?
请参阅上面第 1 点的答案:)
我有 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 万行需要花费太多时间。
- 任何人都可以提出解决此问题的正确方法吗?
- 对于此类问题,是否有任何替代方案?
Cassandra 版本 = Cassandra 2.2.1
Cassandra 数据建模最佳实践建议不要使用集合(list、set、map)来存储海量数据。原因是当加载 CQL 行 (SELECT ... WHERE id=xxx) 时,Cassandra 服务器必须在内存中加载 entire 集合。
现在回答你的问题:
- 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;
- is there any alternative available for this kind of problem?
请参阅上面第 1 点的答案:)