关于Cassandra阅读表现

时间:2016-04-23 07:59:29

标签: java cassandra

我正在研究传感器数据(时间序列)。表中的列数为3000  例如:nodeid,timestamp,sen1,sen2,.....sen-nnodeidtimestamp是按时间戳排列聚类的主键 记录数为10000。

当通过cassandra datastax java驱动程序3.0请求单列(SELECT timestamp,sen1 FROM <table>)requusted的SELECT查询时,它会在15秒内回复;即如果我想要读取所有标签,那么对于所有3000个标签,一次一个标签需要3000 * 15秒=大约12到13个小时。 它位于具有16GB RAM的单节点群集上 我为JVM分配了10GB。仍然没有改变响应时间。我在创建表时使用了LevelCompactionStragy。

硬件:Intel Core i7和普通硬盘不是SSD,8GB RAM 如何减少单节点集群上的读取或查询时间?

2 个答案:

答案 0 :(得分:0)

显然,数据建模存在问题。 IMO,一个有3000列的表是不好的。如果您的用例类似于&#34; SELECT timestamp,sen1 FROM&#34;,那么您应该将其建模为&#34;主键(Timestamp,Sen​​sorId)&#34;。

&#34; SELECT timestamp,sen1&#34;在你的模型中,cassandra仍然会将所有其他列值从磁盘读入内存。

我不确定&#39; nodeId&#39;在你的情况下..我希望它不是cassandra节点ID ..

答案 1 :(得分:0)

  

(SELECT timestamp,sen1 FROM table)

这就像一次获取所有数据(在您的情况下为10000条记录)。 因此,获得1列或3000列将使Cassandra服务器读取所有SSTable。关键是它不会是12或13个小时。

仍然15秒似乎令人难以置信。您是否还在此度量中包含网络延迟和客户端写入?

如其中一个答案所述,您的模型似乎很糟糕(如果您将时间戳作为分区键,则数据变得稀疏,并且需要从多个分区读取一系列数据。如果仅使用node_id作为分区键,分区将承载太多数据并且可以跨越20亿的C *限制。我的建议是

希望这有帮助!