Я использую базу данных Cassandra с драйвером datastax. Мне нужно выполнить пакетное чтение из Cassandra чего-то порядка 2000 строк. Мой вариант использования такой: я получаю список идентификаторов в своем запросе, и эти идентификаторы являются моими ключами разделения в Cassandra. Я хочу знать, стоит ли создавать 2000 потоков и получать данные из Cassandra параллельно (в этом случае чтение данных будет эффективным, поскольку они поступают только к одному узлу) или можно найти способ группировать идентификаторы, которые жить в том же узле, чтобы я мог оптимизировать чтение (теперь в этом случае мне нужно создавать гораздо меньше потоков и меньше накладных расходов на Cassandra). Пожалуйста, дайте мне знать, могу ли я добиться эффективного пакетного чтения, кроме создания нескольких потоков. Спасибо! PS: Данные, возвращаемые Cassandra, не настолько велики, чтобы вызывать OOM.
Расположение узла раздела cassandra
Ответы (1)
можно ли найти способ сгруппировать идентификаторы, которые живут в одном узле
Да, вы можете получить диапазоны токенов для кластера cassandra и проверить появление токенов для ваших идентификаторов в диапазонах, а затем сгруппировать идентификаторы по узлам.
В дополнение:
Нет необходимости создавать много потоков, драйвер datastax предоставляет асинхронный API, мы используем его в нашем проекте для параллельного выполнения большого количества запросов, и он работает достаточно хорошо, но не превосходно с точки зрения производительности.
Необходимость выполнять тысячи запросов на чтение данных указывает на неподходящую модель данных. Вы должны реализовать модель данных вокруг запросов, чтобы свести к минимуму количество запросов для обеспечения хорошей производительности.
Обновлено:
Я полагаю, вы можете использовать метод Metadata.newToken для вычисления токена на стороне драйвера или прямого получения реплик с помощью Metadata.getReplicas для данного ключа раздела. Но перед этим сериализовать ключ раздела в соответствии с его типом и версией протокола.
select token(key) from demotable where key=1231
, чтобы определить значение токена для данного ключа разделения. И я думаю, что делать это плохо, так как снова много раз идет на сервер Cassandra. Я думаю, что должен быть способ получить правильный алгоритм хеширования через data stax, который выполняет свою работу.
- person User5817351; 18.01.2017