【问题标题】:Regarding Cassandra Read Performance关于 Cassandra 读取性能
【发布时间】:2016-08-16 22:26:00
【问题描述】:

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

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

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

【问题讨论】:

  • 您能提供硬件规格吗? CPU 核心数 ?旋转硬盘还是SSD?
  • 一个节点集群是个坏主意。最好有一个 SQL 解决方案。如果您想真正测试 Cassandra,请尝试向集群中添加更多节点并多考虑架构。

标签: java cassandra


【解决方案1】:

显然,数据建模存在问题。 IMO,有 3000 列的表很糟糕。如果您的用例类似于“SELECT timestamp,sen1 FROM”,那么您应该将其建模为“Primary Key(Timestamp, SensorId)”。

"SELECT timestamp,sen1" 在您的模型中,cassandra 仍会将所有其他列值从磁盘读取到内存中。

我不确定在您的情况下“nodeId”是什么。我希望它不是 cassandra 节点 id..

【讨论】:

    【解决方案2】:

    (SELECT timestamp,sen1 FROM table)

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

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2023-03-27
      • 2020-01-26
      • 2015-09-03
      • 2012-05-31
      • 2016-01-05
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多