Производительность Hazelcast с использованием исполнителей на IMAP с миллионами записей - PullRequest
3 голосов
/ 29 апреля 2019

Мы применяем несколько предикатов для imap, содержащих только 100 000 объектов для фильтрации данных. Эти предикаты будут меняться для каждого пользователя. Выполняя POC на моей локальной машине (16 ГБ) с двумя узлами (каждый узел показывает 50000) и 100 000 записей, я получаю вывод за 30 секунд, что намного больше, чем прямой запрос к базе данных.

Сократит ли время увеличение количества узлов, я даже пытался использовать PagingPredicate, но для каждой страницы это занимает около 20 секунд

IMap objectMap = hazelcastInstance.getMap("myMap");
MultiMap resultMap = hazelcastInstance.getMap("myResultMap");

/*Option 1 : passing hazelcast predicate for imap.values*/

objectMap.values(predicate).parallelStream().forEach(entry -> resultMap(userId, entry));

/*Option 2: applying java predicate to entrySet OR localkeyset*/
objectMap.entrySet.parallelstream().filter(predicate).forEach(entry -> resultMap(userId, entry));

1 Ответ

1 голос
/ 29 апреля 2019

Дополнительные узлы помогут, но улучшение трудно определить количественно.Он может быть большим, может быть небольшим.

Часть работы в примере кода включает применение предиката для 100 000 записей.Если индекса нет, этап сканирования проверяет 50 000 записей на узел, если имеется 2 узла.Удвойте до 4 узлов, каждый из которых имеет 25 000 записей для сканирования, и поэтому время сканирования будет вдвое меньше.

Время сканирования является частью времени запроса, общий набор результатов также должен быть сформирован из частичных результатов изкаждый узел.Таким образом, удвоение количества узлов может составить почти половину времени выполнения как лучший вариант, или это может не быть существенным улучшением.

Возможно, более важный вопрос здесь заключается в том, чего вы пытаетесь достичь?

objectMap.values(predicate) в примере кода извлекает набор результатов в центральную точку, к которой затем применяется parallelStream(), чтобы попытаться объединить результаты параллельно в MultiMap.Так что это выглядит скорее как ETL, чем как запрос.

Использование исполнителей в соответствии с заголовком, и что-то вроде objectMap.localKeySet(predicate) может позволить лучше распараллелить это, поскольку не будет центральной точки, удерживающей промежуточныйрезультаты.

...