Cassandra - низкая производительность при пакетной вставке в одном узле с одним столом - PullRequest
2 голосов
/ 07 апреля 2020

Контекст

У меня есть только один узел Cassandra, локально установленный на моем P C с Windows 10 (Core i5, 16 ГБ ОЗУ, накопитель SSD).

Я создал таблица, подобная этой:

CREATE KEYSPACE covid19 WITH replication = {
    'class':              'SimpleStrategy',
    'replication_factor': '1'
};


CREATE TABLE covid19.cases (
    pesel       text,
    test_date   date,
    result      boolean,
    PRIMARY KEY ((pesel), test_date)
)
WITH CLUSTERING ORDER BY (test_date DESC);

pesel - это уникальный 10-значный идентификатор человека.

Затем я сгенерировал 10 000 строк образцов данных, которые выглядят так:

INSERT INTO cases (pesel, test_date, result) VALUES ('0000000001', '2020-03-10', true);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000002', '2020-03-10', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000003', '2020-03-10', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000004', '2020-03-12', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000005', '2020-03-12', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000006', '2020-03-12', false);
...

Наконец, я загрузил данные, используя cql sh: source 'cases.cql';

Задача 1

Для загрузки 10 000 строк требуется 51 секунда. Это нормально?

Я ожидал, что вставки в Cassandra будут очень быстрыми, хотя это довольно сравнимо с SQLite без транзакции (59 с). Если я обертываю вставки с BEGIN & COMMIT в SQLite, это займет меньше секунды. Это приводит нас к другой проблеме ...

Задача 2

Пакетная вставка. Медленная пакетная вставка. Для одного раздела, на одном узле.

Я обернул вставки с BEGIN BATCH и APPLY BATCH;. После этого source заняло так много времени, я перестал измерять после прохождения 4-минутной отметки.

Да, я знаю о неправильном использовании пакетных вставок. Насколько я понял, использование пакетной вставки - это анти-шаблон, если для этого потребуются вставки в разные разделы, что имеет смысл. Это не тот случай.

Почему пакетная вставка так медленно выполняется на одном узле (то есть на одном разделе)?

Что мне здесь не хватает?

1 Ответ

1 голос
/ 13 апреля 2020

Кассандра не является SQLite. Он не оптимизирован для этого варианта использования (работает на одной машине). Он оптимизирован для горизонтального масштабирования. Вы можете запустить его локально, но обычно это только для тестирования. И я не ожидаю, что он будет оптимизирован в любой форме для работы на Windows.

Посмотрите, как записи Cassandra работают на https://blog.softwaremill.com/cassandra-writes-in-depth-6ea8d7581eb

To go немного подробнее, вот что будет происходить в вашем случае для каждой вставки:

  1. Вставить строку в memtable, которая не является просто добавлением, поскольку она должна храниться отсортированной
  2. Добавить строку в CommitLog (файл на диске). Это приложение, не ищите, но все равно это операция с диском.
  3. В какой-то момент будут некоторые операции по гриппу sh. Памятные записываются на диск, с другими данными вычисляются и присоединяются к ним (индекс, фильтры Блума). Все файлы журнала коммитов будут удалены.
  4. Ваш клиентский код может быть не многопоточным, поэтому для получения ответа и отправки другой вставки потребуется некоторое время.

Учитывая, что вы запускаете это на своем компьютере (в 16 ГБ!), Memtable может быть достаточно маленьким, чтобы вызвать несколько сбросов для 10000 строк. Также могут начаться некоторые уплотнения, в зависимости от того, что у вас уже есть.

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

Я проверил рабочий кластер Cassandra; он получает 2000 записей / сек c, а средняя задержка записи составляет менее 1 мс, а также обслуживает 2000 операций чтения / сек c со средней задержкой 1,5 мс. Но это происходит на Linux серверах с 60 ГБ ОЗУ и твердотельным накопителем NVME.

Пакет будет еще хуже из-за дополнительной работы по координации. Пакет не будет улучшением для вашей установки, с 1 узлом, с которым нечего координировать. См. https://medium.com/@foundev / cassandra-пакетная загрузка-без-пакетного ключевого слова-40f00e35e23e

...