MaximumRetryException при чтении данных с Кассандры с использованием мультигета
Я вставляю данные временного ряда с отметкой времени (T) в качестве имени столбца в широком столбце, в котором в одной строке хранятся данные за 24 часа. Потоковые данные записываются из генератора данных (4 экземпляра, каждый с 256 потоками), вставляя данные в несколько строк параллельно.
CF2 (семейство широких столбцов):
RowKey1 (T1, V1) (T2, V3) (T4, V4)......
RowKey2 (T1, V1) (T3, V3).....
:
:
Я сейчас пытаюсь прочитать эти данные с Кассандры, используя multiget. Клиент написан на python и использует pycassa.
Когда я запрашиваю данные за 24 часа для одного ключа строки, возвращается более 2 миллионов точек данных. При параллельном использовании 4 клавиш с помощью multiget я получаю следующую ошибку:
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\columnfamily.py", строка 772, в многосетевом упакованном_кейсе [offset:offset + buffer_size], cp, зр, согласованность)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 576, в результате выполнения return getattr(conn, f)(*args, **kwargs)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 153, в new_f возвращает new_f(self, *args, **kwargs)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 153, в new_f возвращает new_f(self, *args, **kwargs)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 153, в new_f возвращает new_f(self, *args, **kwargs) Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 153, в new_f возвращает new_f(self, *args, **kwargs)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 153, в new_f возвращает new_f(self, *args, **kwargs)
Файл "c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py", строка 148, в new_f (self._retry_count, без учетакласса._name_, exc)) pycassa.pool.MaximumRetryException: повторная попытка 6 раз. Последний сбой был тайм-аут: тайм-аут
Однако ранее мне удавалось получать данные с 256 параллельными ключами. Теперь я увеличил плотность данных (т. Е. Нет точек данных за определенный промежуток времени), и запросы не справляются с этой проблемой.
Мы настроили параметр buffer_size в multiget и обнаружили, что 8 - это самое приятное место.
Размер кучи: 6 ГБ
RAM: 16 ГБ
Последовательность чтения: ОДИН
Кластер: 5 узлов
Загрузка ЦП составляет менее 20%. Кроме того, я не вижу никаких ненормальных шаблонов в пропускной способности чтения, задержке чтения, пропускной способности диска и задержке диска, как сообщает OpsCenter.
Я также попытался увеличить read_request_timeout_in_ms в Cassandra.yaml до 60000, но тщетно. Любые другие указатели относительно того, почему мы получаем это исключение? Я ожидаю, что запрос займет много времени для получения результатов, но, тем не менее, не потерпит неудачу.
Спасибо,
В.С.
1 ответ
(Ответ скопирован с того же вопроса в списке рассылки pycassa.)
Последний сбой был тайм-аут: тайм-аут
Это указывает на тайм-аут на стороне клиента, поэтому настройка read_request_timeout_in_ms
не исправлю это. Вместо этого настройте параметр времени ожидания для вашего ConnectionPool
; по умолчанию это 0,5 секунды.
Для действительно широких рядов вы также можете поэкспериментировать с использованием xget()
параллельно через несколько потоков. Это будет немного лучше распределять нагрузку на ваши запросы и не возлагать такую нагрузку на один узел-координатор.