首页 > 解决方案 > 如何使用java快速将记录插入cassandra表

问题描述

我是 Cassandra 的新手,所以我可能会遗漏一些东西。我的目标是使用 Java(DataStax 驱动程序)尽快插入 500,000 行。它目前每秒只插入 400 条记录,完整的 500,000 条插入需要很长时间才能完全执行。ArrayList 中可能存在重复,因此插入过程应执行插入/更新语句(换句话说,java 列表可能包含重复项,但 db 表应仅包含不同的值)。

选择查询在不到 1 秒的时间内从 cassandra 中返回 500k 条记录,但插入 cassandra 需要很长时间。我希望插入 50 万条记录的时间可以少于 10 秒。我该怎么做才能使插入速度更快?

这是 Cassandra 表的定义:

create table mykeyspace.mytablename
(
    my_id_record text primary key
);

这是java插入(仅显示相关代码,为简单起见删除任何错误处理):

String insertCQL = "INSERT INTO mykeyspace.mytablename(my_id_record) VALUES (?);";
PreparedStatement insertPrepStmnt = session.prepare(insertCQL);
for( String myId: myArrayList) {
       cassandraConnect.session.execute(insertPrepStmnt.bind(myId));
}

如您所见,它将字符串值的 500,00 条记录插入到具有单个字段(主键字段)的表中。

每秒 400 次插入是 Cassandra 的预期速度吗?

任何关于我可以做些什么来加快速度的建议将不胜感激。

标签: javacassandra

解决方案


您正在使用同步 API - 这意味着您在插入下一条记录之前等待答案。您可以通过使用异步 API获得更好的吞吐量,但您需要控制每个连接同时有多少请求在进行中。您可能需要为此控制/调整连接池

但是,如果您真的想从 CSV 或 JSON 等文件中加载数据,我建议您查看DSBulk。如果您只想生成测试数据 - 使用NoSQLBench。两种工具都针对最大吞吐量进行了高度优化。


推荐阅读