Не удается подсчитать количество строк в BigTable

#bigtable #google-cloud-bigtable

#bigtable #google-облако-bigtable

Вопрос:

https://cloud.google.com/bigtable/docs/go/cbt-reference

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

 cbt count <table>
  

для трех разных таблиц.

Для одного из них я получил то, что ожидал: количество строк, немного меньше 1 млн.

Для второй таблицы я получил следующую ошибку:

 [~]$ cbt count prod.userprofile
2016/10/23 22:47:48 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
[~]$ cbt count prod.userprofile
2016/10/23 23:00:23 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
  

Я пробовал это несколько раз, но каждый раз получал одну и ту же ошибку.

В последнем случае я получил другую ошибку (код ошибки такой же, как указано выше, но его описание отличается):

 [~]$ cbt count prod.appprofile
2016/10/23 22:45:17 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
[~]$ cbt count prod.appprofile
2016/10/23 23:11:10 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
  

Я также пробовал это несколько раз, и ничего не изменилось.

Я погуглил и поискал в stackoverflow с «кодом ошибки rpc 4» в качестве ключевых слов, но не нашел ничего полезного.

Мне действительно любопытно, почему эта команда завершилась ошибкой, и что я могу сделать, чтобы решить эту проблему (кстати, эти две таблицы используются в рабочей среде 24/7, и у нас есть несколько десятков узлов big table, работающих просто отлично, поэтому я не думаю, что это связано с пропускной способностью или QPS).

Комментарии:

1. Код ошибки 4 — «превышен крайний срок». Операция «count» очень неэффективна, она должна выполнить полное сканирование таблицы, чтобы получить количество строк. Являются ли две таблицы, которые терпят неудачу, особенно большими? Кроме того, используете ли вы более новую библиотеку Google-cloud-go с автоматическими повторными попытками, которые могли бы здесь помочь?

2. Спасибо за объяснение и предложение. Первая строка (userprofile) довольно большая, так что для меня это неудивительно. Вторая строка на самом деле не очень большая, но я проверю. Я попробую новую библиотеку (я не был в неведении об этом). Спасибо!

Ответ №1:

Для подсчета в большой таблице требуется считывание чего-либо из каждой отдельной строки в Bigtable. Не существует понятия простого получения одного значения, представляющего количество.

К сожалению, для решения проблемы такого типа требуется что-то вроде сопоставления / уменьшения. К счастью, это довольно просто сделать подсчет с помощью Dataflow.

Ответ №2:

В качестве альтернативы возможным (хотя и не лучшим) является использование атомарных счетчиков, то есть:

  1. Счастливая база:https://google-cloud-python-happybase.readthedocs.io/en/latest/happybase-table.html#google.cloud.happybase.table.Таблица.counter_inc
  2. Собственный API: https://googlecloudplatform.github.io/google-cloud-python/stable/bigtable-row.html#google.cloud.bigtable.row.AppendRow.increment_cell_value

Если вы создадите вторую таблицу в качестве вторичного индекса счетчиков, при определенных условиях она может иметь хорошую производительность (если вы не загружаете счетчики одновременными операциями чтения и записи, или у вас возникают проблемы с обработкой счетчиков из-за «горячих точек»).

Тем не менее, сопоставление / уменьшение, безусловно, является более надежным решением, как предложил @solomon-duskis.