我正在尝试使用Cassandra Java驱动程序将大量记录批量插入到群集上的两个不同表中。我开始使用大约600条记录的测试数据集(每张表上有600条记录),但最终会插入大约250万条记录。我正在使用一个准备好的语句,并绑定每个记录PreparedStatement和BoundStatement。
当我同步执行插入时(使用session.execute
),一切都按预期运行,所有记录都被插入并在我从cqlsh执行SELECT COUNT(*)
时显示。但是,如果我使用session.executeAsync
,当我从cqlsh查询时,每个表中只返回大约90%的记录。在插入之后,我正在使用ResultSetFuture.getUninterruptibly
等待所有期货,但这并没有什么不同,即使我尝试批量插入组(例如调用session.executeAsync
50次,然后调用在继续之前的那些50上ResultSetFuture.getUninterruptibly
。
我没有看到任何异常,看resultSet.wasApplied()
总是返回true。我正在使用Cassandra 2.1.4,并且已经在localhost上的3节点集群以及AWS上部署的3节点集群上尝试过这种情况。
编辑:我尝试处理250万条记录的较大数据集只是为了看看会发生什么,在大约30,000条记录之后,我开始在控制台中看到以下消息:
[cluster1-timeouter-0] DEBUG cddriver.core.RequestHandler - onTimeout已触发,但响应由另一个线程完成,取消(retryCount = 0,queryState = QueryState(count = 0,inProgress = false,cancel = false) ),queryStateRef = QueryState(count = 0,inProgress = false,cancel = false))
此外,对于较大的数据集,插入继续的时间越长,处理的记录与成功插入之间的差距就越大。例如。在处理了大约600,000条记录之后,我在Cassandra只看到了大约440,000条记录。我还尝试在每个将来添加一个回调来记录任何失败的控制台:
ResultSetFuture accountFuture = session.executeAsync(insertAccount(insertStmt, record));
Futures.addCallback(accountFuture, new FutureCallback<ResultSet>() {
@Override
public void onSuccess(@Nullable com.datastax.driver.core.ResultSet resultSet) {
// do nothing
}
@Override
public void onFailure(Throwable throwable) {
System.out.printf("Failed with: %s\n", throwable);
}
});
但是,我没有看到控制台出现任何故障。