使用node-cassandra-cql驱动程序性能差,是我做错了什么吗?

3

我正在尝试使用Node向Cassandra插入行。以前我用Mongo代替了Cassandra,我可以在单个节点mongo上合理地获得每秒1500次的插入。使用Cassandra和node-cassandra-cql,我只能获得每秒175-250次的插入。这是性能的巨大下降。这是一个没有索引的表。

cql = require("node-cassandra-cql")
... 
 if (this.dbConnection == null) {
  this.dbConnection = new cql.Client({
    hosts: this.hosts,
    keyspace: this.keyspace
  });
 }
... 
var colAndValues, statement, v;  

colAndValues = "(" + (this.fieldsWithValue.join(',')) + ") values (" + (((function() {
    var _i, _len, _results;
    _results = [];
    for (_i = 0, _len = values.length; _i < _len; _i++) {
      v = values[_i];
      _results.push('?');
    }
    return _results;
  })()).join(', ')) + ")";

  statement = "INSERT INTO " + this.table + " " + colAndValues + ";";

  this.dbConnection.execute(statement, values, cql.types.consistencies.one, function(err) {
    if (err) {
      return emitter.emit('error', err + (" \nstatement: " + statement + "\nvalues: " + (JSON.stringify(values))));
    } else {
      return emitter.emit('complete', true);
    }
  });

好的,这可能有点晦涩,但是语句和值看起来像:

statement: 
INSERT INTO data (order_id,order_ts,transaction_id,transaction_discount,transaction_qty,transaction_total,product_category,product_profit,product_upc,product_name,product_price,product_distributor,store_id,store_name,store_state,store_region,id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

values
[{"value":"70DQLVZLSN","hint":10},"2014-06-08T20:30:23.000Z",{"value":"1OOSC3PL9Q","hint":10},{"value":0,"hint":8},{"value":3,"hint":9},{"value":37.77,"hint":8},{"value":"Movies","hint":10},{"value":3.4,"hint":8},{"value":"PD1334R9688","hint":10},{"value":"The Hunt","hint":10},{"value":12.59,"hint":8},{"value":"IN5","hint":10},{"value":"6LMTY1OWR3","hint":10},{"value":"Sporket Spokane","hint":10},{"value":"WA","hint":10},{"value":"Northwest","hint":10},{"value":"819ddd7f-28e7-4247-90cf-03132ef8b66e","hint":12}]

这些只是插入到虚拟数据库中的测试值。它可以正常工作,但性能很差。我以为添加提示会有所帮助,但并没有。我还尝试了executeAsPrepared,但没有变化。文档说,在执行之前连接不是必需的(驱动程序会存储任何已建立的连接)。因此,我已经无法想出如何加速这个过程了。我想对其进行分析,但在Ubuntu上运行V8分析器一直是一个时间成本高昂的问题(而且没有成功)。

我认为你正在尝试单独插入行,可能是为每个插入发送单独的请求。我认为你应该尝试批量插入。鉴于我对你正在使用的技术不太熟悉,这只是一个猜测。 - Lajos Arpad
一些驱动程序提示:每个进程生命周期创建1个客户端实例;您可以在驱动程序上启用日志记录 https://github.com/jorgebay/node-cassandra-cql#logging ;如果模式不更改,则无需生成查询;为了利用准备好的查询,应重复使用具有不同值的查询... - jorgebg
@jorgebg 我相信这个库会自动跟踪准备好的查询并重复使用它们。我会进一步研究一下。 - jcollum
@jcollum,你能否将这些命令存储在某个地方,并运行一个心跳事件来批量插入这些元素吗? - Lajos Arpad
1
@Cmag,您是否介意提出一个单独的问题,阐述您正在做什么以及遇到了什么问题?由于过去两年中该库已经发生了很大变化,您的代码中可能存在细微差别,这可能更明显地表明问题所在。 - Andy Tolbert
显示剩余3条评论
2个回答

1

以下是可能导致答案的 node-cassandra-cql github 存储库中的问题:

  1. 您是否重用同一客户端实例(应该只使用一个)?
  2. 您是否通过使用 client.connect 方法来预热池?
  3. 您是否已启用驱动程序上的日志记录以查看发生了什么?
  4. 生成的查询是否始终相同(如果不是,则不应使用准备好的语句)?

这已经过去将近两年了。我没有代码。如果没有一些工作,我想我将无法回答这个问题。换句话说,所见即所得,我没有更多的信息可以提供了。 - jcollum
1
@jcollum 是的,我知道。但是Cmag对这个问题很感兴趣,所以我认为这对他可能有用。 - Jehy
@Jehy 谢谢你!:) 我发布了一个可能的答案,将驱动程序版本提升到3.1.0。 - Cmag

0
各位,我们遇到了类似的问题。自从3.0.2版本以来,事情似乎变得更快了。虽然还没有时间进行负载测试来证明,但驱动程序的变更日志引用了一个性能图表,清楚地显示将驱动程序升级到3.1.0可以获得4-5倍的性能提升。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接