我正在研究传感器数据(时间序列)。表中的列数为3000
例如:nodeid,timestamp,sen1,sen2,.....sen-n
。 nodeid
和timestamp
是按时间戳排列聚类的主键
记录数为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 如何减少单节点集群上的读取或查询时间?
答案 0 :(得分:0)
显然,数据建模存在问题。 IMO,一个有3000列的表是不好的。如果您的用例类似于&#34; SELECT timestamp,sen1 FROM&#34;,那么您应该将其建模为&#34;主键(Timestamp,SensorId)&#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 *限制。我的建议是
SELECT * from Table where sensor_node_id = abc and year = 2016 and month = June
希望这有帮助!