使用datastax java驱动程序2.1.7高速插入cassandra时丢失的数据

时间:2015-08-19 09:20:28

标签: java cassandra-2.0 datastax-java-driver

我是apache-cassandra的新手,我打算将它作为新项目的数据存储库用于其写入性能。我已经设置了一个带有三个节点和复制因子3的cassandra集群。我的程序A使用datastax的cassandra-driver-core 2.1.7来编写和读取来自cassandra的数据。每次执行程序都会使用批处理语句将大约50条记录写入cassandra。单次执行的测试显示完全没有问题。但是,当我开始以更密集的方式运行A时,会出现问题。

详情如下: 另一个程序B在10秒内调用A 40次,因此在B完成执行后cassandra中应该有2k条记录。但是,写入cassandra的记录数量仅为2k记录中的25-30%(在B的每次运行中随机变化)。顺便说一句,我使用cqlsh来检查写入的记录数。我需要多次重新运行B,以便最终所有2k记录都可以写入cassandra。

我现在完全没有线索,A和B的执行都没有报告错误,而且从日志中,A确实执行了40次。

我不知道这是否与集群设置,一致性级别设置等有关,或者是否需要进行任何调整以处理更高频率的写入。

代码如下:

String query = "insert into A (a,b,c,d,e,f) values (?,?,?,?,?,?)";
PreparedStatement p = session.prepare(query);
BatchStatement b = new BatchStatement();
for (int i=0; i<50; i++) {
  BoundStatement b1 = p.bind();
  b1.setInt("a",A);
  ...
  b1.setInt("f",F);
  b.add(b1);
}
session.execute(b);

非常感谢任何帮助!

增加:

我改变了我的代码,不使用批处理语句作为@aaron和其他人的建议。问题仍然存在,并非所有记录都写入cassandra(我的意思是我无法使用cqlsh的select语句看到它们)。过了一会儿,我注意到问题只发生在以前插入的记录中(在使用delete cqlsh语句再次插入之前删除)。如果之前从未插入过记录,则使用cqlsh的“select * from”显示正确的结果。任何人都可以告诉我为什么会这样,如果有办法避免这种情况发生?非常感谢。

0 个答案:

没有答案