2016-08-17 5 views
2

У меня есть запрос, который извлекает миллионы строк (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). (Я не знаю, заняты ли узлы или что-то еще происходит).Драйвер java драйвера Datastax Cassandra RetryPolicy для выписки с подкачкой

До сих пор я попытался установить более высокую 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 это число повторных попыток, что я attemp для выборки данных.

+0

Какой у вас размер страницы? –

+0

@fuggy_yama Я работаю с размером страницы в 100 строк. – juliccr

ответ

3

Когда вы используете размер выборки в драйвере запроса, он никогда не выдаст весь запрос вверх. Даже если вы не укажете размер выборки, драйвер будет использовать 5000 в качестве размера выборки, чтобы предотвратить перегрузку памяти со многими объектами. Что происходит, это то, что кусок результатов извлекается путем выдачи запроса с лимитом и, пока вы повторяете результаты, когда вы добираетесь до конца chunk-драйвера, выдается запрос для следующего количества результатов и так далее. В целом, если число результатов больше, чем размер выборки, несколько запросов будут выдаваться из драйвера в кластер. На диаграмме official datastax driver page видна диаграмма последовательности и другие пояснения.

Это говорит о том, что RetryPolicy работает только с одним заявлением и ничего не знает о размере выборки, так что утверждение будет повторяться столько раз, сколько вы определяете (это означает, что только этот кусок будет повторен по истечении таймаута).

+0

Спасибо, Ненад Бозич! Имея это в виду, я попытаюсь выяснить, как перенести эти миллионы строк. – juliccr

+0

Вы можете ознакомиться с нашим открытым исходным кодом, https://github.com/smartcat-labs/cassandra-migration-tool-java, он занимается миграцией схем и данных, и мы использовали его для переноса данных из одного места в другое. другой. –