Какой лимит партии в Кассандре?

У меня есть клиент Java, который отправляет записи (INSERT) в пакетном режиме в кластер Cassandra. Все элементы в пакете имеют один и тот же ключ строки, поэтому все они будут помещены в один узел. Также мне не нужно, чтобы транзакция была атомарной, поэтому я использовал незарегистрированный пакет.

Количество команд INSERT в каждом пакете зависит от разных факторов, но может быть от 5 до 50000. Сначала я просто поместил столько команд, сколько у меня было в одном пакете, и отправил его. Это выбросило com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large. Затем я использовал ограничение в 1000 INSERT на пакет, а затем снизилось до 300. Я заметил, что я просто случайно угадываю, не зная точно, откуда исходит этот предел, что может вызвать проблемы в будущем.

У меня вопрос, что это за предел? Могу я его изменить? Как я могу узнать, сколько элементов можно разместить в партии? Когда моя партия "полная"?


person m.hashemian    schedule 09.01.2016    source источник


Ответы (3)


Я бы рекомендовал не увеличивать лимит, а просто разбивать его на несколько запросов. Объединение всего в один гигантский запрос существенно негативно повлияет на координатора. Размещение всего в одном разделе может улучшить пропускную способность в пакетах некоторых размеров за счет уменьшения некоторой задержки, но пакеты никогда не предназначены для повышения производительности. Поэтому попытка оптимизации для получения максимальной пропускной способности с использованием разных размеров пакетов будет в значительной степени зависеть от варианта использования / схемы / узлов и потребует специального тестирования, поскольку обычно наблюдается обрыв в размере, при котором он начинает ухудшаться.

Существует

# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50

в вашем cassandra.yaml, чтобы увеличить его, но обязательно проверьте, чтобы убедиться, что вы действительно помогаете, а не снижаете пропускную способность.

person Chris Lohfink    schedule 10.01.2016
comment
Это то, что я искал, спасибо. Вы знаете, как лучше всего отслеживать размер партии в клиенте? - person m.hashemian; 10.01.2016
comment
Зависит от используемого вами драйвера, но в java-драйвере вы можете использовать getValues ​​() для каждого отдельного оператора в вашем пакете, который возвращает вам массив ByteBuffers, для которого вы можете использовать метод left (), чтобы получить размер Буферизует индивидуально и суммирует их все, но в целом я бы не рекомендовал это делать. Вы не должны создавать сверхбольшие партии, просто достаточно большие, чтобы вы могли почувствовать, что вы далеко не приблизились к этому пределу. - person Andy Tolbert; 11.01.2016
comment
ну, здесь есть куча вещей. C * проповедует дизайн по столбцам, а не по строкам, а C * говорит, что 2B столбцов на раздел, но эмпирически мы знаем, что оптимальное место составляет 100 МБ. так что даже с разделом 100 МБ и если размер пакета по умолчанию составляет 50 КБ, то есть 100 МБ / 50 КБ = 3125 запросов на получение раздела 100 МБ, так что слишком много запросов. - person user1870400; 03.11.2016
comment
Требуется ли пакетная обработка данных через координатора даже сегодня? Почему мы не можем использовать политику, учитывающую токены, и напрямую передавать все строки одного раздела (предположим, что размер данных всех строк составляет 100 МБ) на правильный узел? если нет, то каков будет оптимальный размер пакета для получения раздела размером 100 МБ за несколько запросов? - person user1870400; 03.11.2016
comment
@ user1870400 Вам не нужно использовать пакетные запросы, если вы собираетесь получить весь раздел. Просто используйте 1 запрос с разбиением на страницы. Если вы пишете раздел, мне кажется, что 3000 запросов на 100MB меня устраивают. - person user3711864; 30.05.2017

Глядя на журналы Cassandra, вы сможете обнаружить такие вещи, как:

ОШИБКА 19:54:13 Пакет для [совпадений] имеет размер 103,072 КБ, что превышает указанный порог в 50 000 КБ на 53,072 КБ. (см. batch_size_fail_threshold_in_kb)

person fivetwentysix    schedule 18.01.2017
comment
@ user1870400, я использую эту конфигурацию ..cassandra.concurrent.writes = 1500 cassandra.output.batch.size.bytes = 2056 cassandra.output.batch.grouping.key = partition cassandra.output.consistency.level = ЛЮБАЯ кассандра. output.batch.grouping.buffer.size = 3000 cassandra.output.throughput_mb_per_sec = 25 - person BdEngineer; 23.11.2018
comment
@ user1870400, где у меня 200 миллионов записей x каждая запись по 100 байтов .... загрузка этих данных занимает 2 часа .... так как же точно настроить вышеуказанные параметры? - person BdEngineer; 23.11.2018

Я исправил эту проблему, изменив CHUNKSIZE на более низкое значение (например, 1) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html

КОПИРОВАТЬ mytable ИЗ mybackup С CHUNKSIZE = 1;

Операция выполняется намного медленнее, но, по крайней мере, сейчас работает

person Etienne Cha    schedule 26.10.2016