Ошибка тайм-аута операции в консоли cqlsh cassandra

У меня есть три узла Cassandra Cluster, и я создал одну таблицу с более чем 2 000 000 строк.

Когда я выполняю этот (select count(*) from userdetails) запрос в cqlsh, я получаю эту ошибку:

OperationTimedOut: ошибки = {}, last_host = 192.168.1.2

Когда я запускаю функцию подсчета для меньшего количества строк или с ограничением 50 000, она работает нормально.


person Kaushal    schedule 01.04.2015    source источник


Ответы (7)


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.

Для очень простого примерного числа вы можете получить расчетное количество разделов от system.size_estimates во всех перечисленных диапазонах (обратите внимание, что это число только на одном узле). Умножьте это на количество узлов, а затем разделите на RF.

person Chris Lohfink    schedule 01.04.2015
comment
Пожалуйста, не могли бы вы рассказать мне подробнее, как получить его из JMX? - person Kaushal; 01.04.2015
comment
+1 проголосовал. Другой альтернативой (удерживать count в количестве записей) было бы использование для этого аккуратных распределенных счетчиков Cassandra (в отдельном CF просто увеличивайте его при каждой вставке). Вам нужно будет получить текущее количество строк (например, выполнить итерацию в коде), чтобы указать начальное количество начальных значений при настройке. - person ChristopheD; 02.04.2015
comment
Немного устарело для обновления, но после issues.apache.org/jira/browse/CASSANDRA-9107 вы можете использовать org.apache.cassandra.metrics:type=ColumnFamily,keyspace={{Keyspace}},scope={{Table​}},name=EstimatedRowCount (EstimatedPartitionCount в более новых версиях), чтобы включить число в memtables, и вы получите лучшую работу по получению прибл. количество строк. - person Chris Lohfink; 19.11.2015

Вы также можете увеличить время ожидания в команде cqlsh, например:

cqlsh --request-timeout 120 myhost
person Sergey Shcherbakov    schedule 09.05.2016

Чтобы изменить ограничение времени ожидания клиента в Apache Cassandra, существует два метода:

Метод 1: Измените файл cqlshrc.

Метод 2: Откройте программу cqlsh и измените время, указанное с помощью переменной client_timeout.

Для получения подробной информации перейдите по ссылке: https://playwithcassandra.wordpress.com/2015/11/05/cqlsh-increase-timeout-limit/

person Sashank Bhogu    schedule 05.11.2015

если вы используете cqlsh: откройте скрипт в редакторе и найдите все слова «тайм-аут». Измените значение по умолчанию с 10 на 60 и сохраните скрипт.

person Oleg Belous    schedule 27.07.2015
comment
как это сделать, если ваш скрипт не связан с конфигурационным файлом - person Arsalan Saleem; 17.09.2015

Я использую Cassandra 3.4 и cqlsh для подсчета записей. Похоже, что в 3.4 код был изменен. cqlsh просто вызывает cqlsh.py. Внутри cqlsh.py есть переменная DEFAULT_REQUEST_TIMEOUT_SECONDS, которая по умолчанию равна 10 (секундам). Я изменил его на 3600 (1 час), и теперь мои SELECT count(*) запросы работают.

person Kyle Burke    schedule 20.04.2016

у меня та же проблема, что и у вас выше, если я делаю подсчет за день, но в качестве обходного пути я разделил подсчет на два запроса (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> 
person Jasonw    schedule 20.08.2015

Я использую Cassandra 3.11 и cqlsh для подсчета записей. В моей таблице около 40 000 000 строк, и я столкнулся с этой проблемой. моя проблема решена с двумя изменениями:

во-первых, измените все конфигурации тайм-аута в cassandra.yaml на всех узлах:

# 3,600,000 is one hour in ms
read_request_timeout_in_ms: 3600000
range_request_timeout_in_ms: 3600000
write_request_timeout_in_ms: 3600000
counter_write_request_timeout_in_ms: 3600000
cas_contention_timeout_in_ms: 3600000
truncate_request_timeout_in_ms: 3600000
request_timeout_in_ms: 3600000
slow_query_log_timeout_in_ms: 3600000

затем перезапустите cassandra на всех узлах.

а второй работает cqlsh с указанием времени ожидания, как показано ниже:

cqlsh --request-timeout=3600000 <myhost>
person Mohammad Rahmati    schedule 19.02.2019