【问题标题】:Cassandra: thousands of records to insertCassandra:要插入数千条记录
【发布时间】:2014-05-25 17:03:55
【问题描述】:

我正在使用带有 C++ 驱动程序的 Cassandra,并且在插入数千行时发现性能非常缓慢。我正在使用带有 8Go Ram 和 4CPU 的 VM Ubuntu 12.04 LTS。

我有一个包含 15800 条记录的 ascii 文件,我正在尝试读取每条记录并填充我的 cassandra db 表。 “复制”命令大约需要 1 分 30 秒。逐条读取每条记录后进行查询大约需要 6-7 分钟,而批量查询则需要永远(持续 30 分钟然后我放弃了!)。

我想知道这种插入是否有更快性能的解决方案。

非常感谢!

【问题讨论】:

  • 这里没有足够的信息可以说明。我会从获取一些更详细的指标开始——整个过程中的单个指标并不能确定哪些活动是缓慢的。为每项活动安排一些时间,并找出最大的贡献者是什么。
  • 你还需要共享一些代码,这样我们就可以看到是否有任何明显的错误,例如每次插入的新会话或准备好的语句。
  • 我使用 sstableloader 实用程序在几分钟内导入了大量数据,但确实需要一些摆弄。
  • 您的 Ubuntu 虚拟机是否有用于交换的挂载点?在 Cassandra (Linux) 服务器上,应完全禁用交换。

标签: performance cassandra cql3 nosql


【解决方案1】:

这是我的源代码:

string create_query = "BEGIN BATCH ";
std::ifstream file("/media/sf_Shared/xfmge");
for(string line; getline(file, line);){
    stringstream sstm;
    record = (char*)line.c_str();
    sstm << "insert into felder (id, data) values ('felder', '" << record << "') ";
    create_query += sstm.str();
}
create_query += " APPLY BATCH;";

boost::shared_ptr<cql::cql_query_t> create(
        new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
query_result = session->query(create);
cout << "sending..." << endl;
query_result.wait();
if (query_result.get().error.is_err()) {
    cout << "-isbuild - ERROR in query: " << create_query << endl;
    cout << query_result.get().error.message << endl;
    return iserrno;
} else {
    cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
}

【讨论】:

    【解决方案2】:

    我设法通过切片将时间间隔减少到 12.5 秒。这是解决方案,如果它可以帮助其他人,如果其他人可以提供更好的解决方案,我会很高兴:)

    int nb_lines = 0;
    int rest = 0;
    string create_query = "BEGIN BATCH ";
    std::ifstream file("/media/sf_Shared/xfmge");
    for(string line; getline(file, line);){
        stringstream sstm;
        if(nb_lines  == 800 ) {
            nb_lines = 0;
            rest = 0;
            create_query += " APPLY BATCH;";
            boost::shared_ptr<cql::cql_query_t> create(
                new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
            query_result = session->query(create);
    
            query_result.wait();
            if (query_result.get().error.is_err()) {
                cout << "-isbuild - ERROR for query: " << create_query << endl;
                cout << query_result.get().error.message << endl;
                return iserrno;
            } else {
                cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
            }
            create_query = "BEGIN BATCH ";
        } else {
            record = (char*)line.c_str();
            sstm << "insert into felder (id, data) values ('felder', '" << record << "') ";
            create_query += sstm.str();
            rest = 1;
        }
        nb_lines ++;
    }
    if(rest == 1){
        create_query += " APPLY BATCH";
        boost::shared_ptr<cql::cql_query_t> create(
            new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
        query_result = session->query(create);
    
        query_result.wait();
        if (query_result.get().error.is_err()) {
            cout << "-isbuild - ERROR for query: " << create_query << endl;
            cout << query_result.get().error.message << endl;
            return iserrno;
        } else {
            cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
        }   
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2018-11-18
      • 2021-09-23
      • 1970-01-01
      • 2017-06-02
      • 2019-08-10
      • 2017-01-07
      • 2013-08-03
      相关资源
      最近更新 更多