我使用以下查询在cassandra数据库中创建了一个表:
CREATE TABLE table(
num int,
part_key int,
val1 int,
val2 float,
val3 text,
...,
PRIMARY KEY((part_key),num)
);
该表存储来自技术设备的数据。每个记录的分区键part_key为1,因为我只想在一个服务器上执行范围查询。我知道这对Cassandra来说是一个糟糕的用例,但我需要这样做才能进行比较。
主键num是记录的编号(从1到8.000.000)。
每条记录有400个其他值,分别是float,int和text类型。我在此表中插入了8.000.000条记录(43 GB),并希望运行我的查询,如:
SELECT num, val1, val45, val90
FROM ks.table
WHERE part_key=1 AND num>9999 AND num<20001;
我在cql-shell中执行了查询,并且“操作超时”。所以我将cassandra.yaml文件中的read_request_timeout_in_ms和range_request_timeout_in_ms更改为60000(2分钟)。
再次执行查询时,我在5分钟后得到“错误10054:现有连接被远程主机关闭”。 Datastax Cassandra社区服务器2.0.11服务在服务器上不再运行。
我重新启动了服务,再次尝试了,服务又崩溃了。我甚至无法重启服务,我不得不重新启动服务器。 我也尝试使用Cassandra cpp-driver,也无法执行此查询。
像
这样的小问题... AND num<1000;
仍有可能。
我的问题是:我做错了什么吗?我知道Cassandra有更多的节点更好,但我认为Cassandra只需要更多的时间。有可能,Cassandra无法执行这样的查询吗?
谢谢!
服务器:
Intel(R)Xeon(R)CPU E5504 @ 2.00GHz 2.00GHz(2个处理器)/ 16GB RAM
CPU利用率:50% - 60%,15秒后约30%/ RAM:整个时间为2.9 GB
编辑:
我的Cassandra密钥空间现在为60GB,小查询如
... AND num<10;
甚至Inserts返回时间。有时服务崩溃...... 有想法的人可以解释一下吗?一个答案说,一个拥有43GB的节点在拥有更多节点的集群中是不同的,就像我的集群中只有一个节点一样。有人可以解释一下吗?
谢谢!
答案 0 :(得分:2)
这里的一个关键问题是,您运行的C *版本的cqlsh不会翻页结果。这意味着在查询时必须序列化整个结果集,因为您的数据模型将非常大(如kha所指出的)。我会尝试使用启用分页的驱动程序执行类似的查询,当然要确保您有足够的网络带宽来返回数据。
43GB应该可以通过单个C *节点轻松处理,尽管仅使用单个节点运行C *集群会牺牲C *提供的几乎所有优势。