Ошибка таймаута операции Ошибка в консоли cclsh cassandra
У меня есть три узла Cassandra Cluster, и я создал одну таблицу с более чем 2 000 000 строк.
Когда я выполняю этот запрос (select count(*) from userdetails
) в cqlsh, я получил эту ошибку:
OperationTimedOut: errors = {}, last_host = 192.168.1.2
Когда я запускаю функцию подсчета для меньшей строки или с ограничением 50 000, она работает нормально.
Ответы
Ответ 1
count (*) фактически просматривает все данные. Таким образом, ожидается, что select count(*) from userdetails
без ограничения будет тайм-аут с таким количеством строк. Некоторые подробности здесь:
http://planetcassandra.org/blog/counting-key-in-cassandra/
Возможно, вам захочется рассмотреть вопрос о сохранении счета, используя Spark, или если вы просто хотите номер шара, вы можете его захватить из JMX.
Чтобы захватить JMX, это может быть немного сложно в зависимости от вашей модели данных. Чтобы получить количество разделов, возьмите org.apache.cassandra.metrics:type=ColumnFamily,keyspace={{Keyspace}},scope={{Table}},name=EstimatedColumnCountHistogram
mbean и суммируйте все 90 значений (это то, что выдает nodetool cfstats
). Это даст вам только число, которое существует в sstables, поэтому, чтобы сделать его более точным, вы можете сделать флеш или попытаться оценить число в memtables из MemtableColumnsCount
mbean
Ответ 2
Вы также можете увеличить таймаут в команде cqlsh, например:
cqlsh --request-timeout 120 myhost
Ответ 3
Чтобы изменить лимит времени ожидания клиента в Apache Cassandra, существуют два метода:
Техника 1: Измените файл cqlshrc.
Техника 2: Откройте программу cqlsh и измените время, указанное с помощью переменной client_timeout.
Подробнее см. ссылку: https://playwithcassandra.wordpress.com/2015/11/05/cqlsh-increase-timeout-limit/
Ответ 4
если вы используете cqlsh: откройте script в редакторе и найдите все слова "timeout". Измените значение по умолчанию от 10 до 60 и сохраните script.
Ответ 5
Я использую Cassandra 3.4 и cqlsh, чтобы получить количество записей. Похоже, что в версии 3.4 произошел сбой кода. cqlsh просто вызывает cqlsh.py. Внутри cqlsh.py есть переменная DEFAULT_REQUEST_TIMEOUT_SECONDS
, которая по умолчанию равна 10 секундам. Я изменил его на 3600 (1 час), и теперь мои запросы SELECT count(*)
работают.
Ответ 6
с той же проблемой, что и вы выше, если я делаю подсчет в течение дня, но, как работа, я разделил счет на два запроса (12 часов + 12 часов), например ниже.
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 00:00:00' and insert_time <= '2015-08-20 11:59:59' ALLOW FILTERING;
count
-------
42528
(1 rows)
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 12:00:00' and insert_time <= '2015-08-20 23:59:59' ALLOW FILTERING;
count
-------
86580
(1 rows)
cqlsh:jw_schema1>