具有分页

时间:2016-08-17 20:50:50

标签: java cassandra datastax-java-driver

我正在运行一个获取数百万行(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 是我将尝试获取数据的重试次数。

1 个答案:

答案 0 :(得分:3)

在查询驱动程序上使用提取大小时,永远不会预先发出整个查询。即使您没有指定提取大小,驱动程序也会使用5000作为提取大小,以防止使用许多对象重载内存。发生的事情是,通过发出带有限制的查询来获取结果块,当您迭代结果时,当您到达块驱动程序结束时将发出以下数量的结果查询,依此类推。总而言之,如果结果数量大于获取大小,则会从驱动程序到群集发出多个查询。在official datastax driver page上可以看到好的序列图以及其他解释。

据说RetryPolicy适用于单个语句,并且对提取大小一无所知,因此该语句将重新定义您定义的次数(意味着只有该块将在超时时重试)。