Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决cassandra中的写入超时异常?_Java_Exception_Cassandra_Prepared Statement_Resultset - Fatal编程技术网

Java 如何解决cassandra中的写入超时异常?

Java 如何解决cassandra中的写入超时异常?,java,exception,cassandra,prepared-statement,resultset,Java,Exception,Cassandra,Prepared Statement,Resultset,我正在尝试将50000条记录插入一个五节点cassandra集群。我正在使用executeAsync以提高性能(减少应用程序端的插入时间)。我尝试使用几个批量大小的Batchstatement,但每次都出现以下异常 Exception in thread "main" com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE

我正在尝试将50000条记录插入一个五节点cassandra集群。我正在使用executeAsync以提高性能(减少应用程序端的插入时间)。我尝试使用几个批量大小的Batchstatement,但每次都出现以下异常

Exception in thread "main" com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
at com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:54)
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:259)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:175)
at 
我插入了数据,即1000020000到40000条记录,没有任何问题。下面是我编写的java代码

for (batchNumber = 1; batchNumber <= batches; batchNumber++) {
    BatchStatement batch = new BatchStatement();
    for (record = 1; record <= batchSize; record++) {
        batch.add(ps.bind(query));
    }
    futures.add(session.executeAsync(batch));           
}
for (ResultSetFuture future : futures) {
    resultSet = future.getUninterruptibly();
}

for(batchNumber=1;batchNumber这不是
BATCH
的用途。 当您向一个批处理中添加多个语句时,Cassandra将尝试以原子方式应用它们。 它们要么全部成功,要么一个也不会成功,并且它们都必须在一个查询超时内完成

此外,如果您发出的请求超过了可以同时处理的数量,那么它们将进入一个队列,而队列中的等待时间会导致超时

要在不超时的情况下完成所有操作,请使用单独的语句并在任何时候限制飞行中的数量。
或者,使用命令从CSV加载数据。

这不是批处理的目的。 当您向一个批处理中添加多个语句时,Cassandra将尝试以原子方式应用它们。 它们要么全部成功,要么一个也不会成功,并且它们都必须在一个查询超时内完成

此外,如果您发出的请求超过了可以同时处理的数量,那么它们将进入一个队列,而队列中的等待时间会导致超时

要在不超时的情况下完成所有操作,请使用单独的语句并在任何时候限制飞行中的数量。 或者,使用命令从CSV加载数据。

我看到一些错误:

  • 似乎您正在尝试找出可以批处理在一起的最大查询数
  • 您似乎认为批处理多个语句会给您带来某种性能增益
  • 您在循环中错误地重用了相同的预处理语句
  • 您没有以某种摄取率限制应用程序
  • 您没有执行任何异常处理,例如当某个批处理失败时重试
  • 让我们重新开始


  • 批处理中语句的最大数量应小于10。越小越好。顺便说一句,批处理的总大小必须小于YAML配置文件中的任何值。通常,如果批处理大于5kb,则日志中将显示警告。如果批处理大于50kb,则批处理将被删除将失败。您可以调整这些值,但应记住,
    批处理
    重载协调器节点。批处理越大(以kb或语句数表示),协调器上的重载越大
  • 将不相关的语句批处理在一起不会带来任何好处。相反,您实际上会失去性能。这是由于批处理
  • 的工作方式。选择一个节点来协调所有语句,该节点将负责所有语句。通常,协调器是根据第一条语句选择的,如果ur语句命中多个节点,您的协调器也需要协调属于不同节点的内容。相反,如果您触发多个单独的异步查询,则每个节点将只负责它们的语句。您将在所有集群节点上分散过载,而不是在一个节点上进行重载
  • 您以错误的方式使用准备好的语句。您应该添加一个
    新的BoundStatement(ps).bind(xxxx)
    语句。无论如何,这是一个简单的修复方法
  • 如果有大量查询要运行,那么您将一直运行这些查询。您将耗尽应用程序内存,因为它将不断向列表中添加
    future
    s,并且最终将由于OOM错误而被终止。此外,您没有给您的集群提供实际接收所有数据的可能性向它开火,因为你可以以比你的集群接收更快的速度发射数据。你需要做的是限制列表中未来的数量。将其保持在某个最大值(例如1000)。要执行此任务,您需要在循环中移动最后一个循环,并使用
    。GetUnterruptibly
    。这样,您可以降低摄取率,并将看到超时异常计数减少。根据应用程序的不同,减少超时异常意味着重试次数减少,从而减少查询、开销和响应时间等等
  • Future
    的列表中使用
    .getunterruptibly
    循环是可以的,但是当您的集群 重载时,超时。此时,您应该捕获异常并处理它,无论是重试还是重新抛出,无论是什么。我建议您围绕幂等查询设计模型,以便我可以重试失败的查询,直到成功,而不必担心重试结果(这也可能发生在驾驶员级别!)
  • 希望这能有所帮助。

    我看到一些错误:

  • 似乎您正在尝试找出可以批处理在一起的最大查询数
  • 您似乎认为批处理多个语句会给您带来某种性能增益
  • 您在循环中错误地重用了相同的预处理语句
  • 您没有以某种摄取率限制应用程序
  • 您没有执行任何异常处理,例如当某个批处理失败时重试
  • 让我们重新开始


  • 批处理中语句的最大数量应小于10。越小越好。顺便说一句,批处理的总大小必须小于YAML配置文件中的任何值。通常,如果批处理大于5kb,则日志中会出现警告。如果批处理大于50kb,则批处理