java - 如何使用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 的预期速度吗?
任何关于我可以做些什么来加快速度的建议将不胜感激。
解决方案
您正在使用同步 API - 这意味着您在插入下一条记录之前等待答案。您可以通过使用异步 API获得更好的吞吐量,但您需要控制每个连接同时有多少请求在进行中。您可能需要为此控制/调整连接池。
但是,如果您真的想从 CSV 或 JSON 等文件中加载数据,我建议您查看DSBulk。如果您只想生成测试数据 - 使用NoSQLBench。两种工具都针对最大吞吐量进行了高度优化。
推荐阅读
- facebook - Facebook 消息给所有朋友
- angular - 如何为 *ngFor 中的对象动态添加样式
- laravel-5.6 - Laravel Eloquent 到 php
- r - 从两个列表中创建一个,首先将第二个列表值放在下面
- php - htaccess 重写在参数末尾发出 .php
- c# - 无法加载文件或程序集(运行时错误)
- r - 抓取每个链接页面并将其存储为 XML 表
- java - 指定 cxf-codegen-plugin 使用的 JAXB/XJC 版本
- symfony - 从 symfony 模板中的断言获取消息
- php - Zend 2.0 Apache Web 服务器配置