Кастандра dasastax OperationTimedOutException - PullRequest
0 голосов
/ 02 ноября 2018

Я использую 3 узла cassandra 3.0.14, развернутые на 3 разных ВМ. У меня много данных (миллиарды), и я бы хотел быстро найти среди своей архитектуры Cassandra.

Я провел много исследований Кассандры, но все еще сталкиваюсь с некоторыми проблемами, которые не могу понять:

1- Когда я использую cqlsh, я могу сделать запрос, который анализирует всю мою базу данных

SELECT DISTINCT val_1 FROM myTable; работает.

Однако я не могу сделать тот же запрос, используя мой код Java и драйвер datastax. Мой сценарий возврата:

Caused by: com.datastax.driver.core.exceptions.OperationTimedOutException: [/XX.XX.XX.XX:9042] Timed out waiting for server response

2- Некоторые запросы работают с использованием cqlsh, но выполнение более конкретного запроса приведет к превышению времени ожидания запроса:

OperationTimedOut: errors={'127.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=127.0.0.1

Например, если я делаю этот запрос:

SELECT val_1 FROM myTable where time>'2018-09-16 09:00:00'; будет работать SELECT val_1 FROM myTable where time>'2018-09-16 09:00:00' and time<'2018-09-17 09:00:00'; приведет к тайм-ауту

Я изменил свой request_timeout_in_ms на 60 с, но я знаю, что это не очень хорошая практика. Я также увеличил свои read_request_timeout_in_ms и range_request_timeout_in_ms, но у меня все еще есть предыдущие проблемы.

У кого-нибудь были бы такие же проблемы?

-Николас

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Это происходит потому, что вы используете Кассандру неправильно. Операции диапазона, различные и т. Д. Лучше всего работают, только если в вашем запросе указан ключ разделения. В противном случае Cassandra нужно будет сканировать весь кластер, пытаясь найти нужные вам данные, и это приведет к таймауту даже в базе данных среднего размера. Не используйте ALLOW FILTERING для принудительного выполнения запросов.

В Cassandra структура базы данных моделируется вокруг запросов, которые вы хотите выполнить. Я рекомендую пройти курсы DS201 и DS220 в Академии DataStax .

0 голосов
/ 02 ноября 2018

Попробуйте настроить время ожидания клиента в коде Java следующим образом:

//configure socket options
SocketOptions options = new SocketOptions();
options.setConnectTimeoutMillis(30000);
options.setReadTimeoutMillis(300000);
options.setTcpNoDelay(true);

//spin up a fresh connection (using the SocketOptions set up above)
cluster = Cluster.builder().addContactPoint(Configuration.getCassandraHost()).withPort(Configuration.getCassandraPort())
            .withCredentials(Configuration.getCassandraUser(), Configuration.getCassandraPass()).withSocketOptions(options).build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...