我正在运行一个查询,获取数百万行(5.000.000左右)。我的节点似乎很忙,因为协调器返回一个com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)异常。(我真的不知道节点是忙着还是其他事情正在发生)。
到目前为止,我已经尝试在每个Cassandra节点上设置一个更高的read_request_timeout_in_millis,并执行如下查询
new SimpleStatement("SELECT * FROM where date = ? ",param1)
.setFetchSize(pageSize).setConsistencyLevel(ConsistencyLevel.ONE)
.setReadTimeoutMillis(ONE_DAY_IN_MILLIS);
ResultSet resultSet = this.session.execute(statement);但例外情况仍在被抛出。我的下一步是尝试自定义RetryPolicy,但是可以告诉我readTimeout重试是否会再次执行整个查询,还是会从当前失败的页面重试?。
我试着做这样的事:
@Override
public RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
if (dataRetrieved) {
return RetryDecision.ignore();
} else if (nbRetry < readRetries) {
LOGGER.info("Retry attemp {} out of {} ",nbRetry,readRetries);
return RetryDecision.retry(cl);
} else {
return RetryDecision.rethrow();
}
}其中,readReatries是我为获取数据而安排的重试次数。
发布于 2016-08-18 08:35:21
当您在查询上使用fetch大小时,驱动程序永远不会预先发出整个查询。即使没有指定fetch大小,驱动程序也会使用5000作为获取大小,以防止使用许多对象重载内存。正在发生的情况是,结果块是通过发出有限制的查询来获取的,当您迭代结果时,当您到达块驱动程序结束时,将发出以下结果数的查询,等等。总之,如果结果数目较大,那么获取大小的查询将从驱动程序发出到集群。在官方datastax驱动程序页面上可以看到漂亮的序列图以及其他解释。
也就是说,RetryPolicy只在单个语句上工作,并且对获取大小一无所知,因此该语句将被重新尝试定义的次数(这意味着只有该块在超时时才会被重新尝试)。
https://stackoverflow.com/questions/39006050
复制相似问题