Как автоматически экспортировать большие наборы данных Neo4j для анализа - PullRequest
0 голосов
/ 02 мая 2018

Я столкнулся с технической проблемой, связанной с использованием Neo4j, которая на некоторое время поставила меня в тупик. Моя организация использует Neo4j для моделирования моделей взаимодействия с клиентами. График вырос до размера около 2 миллионов узлов и 7 миллионов ребер. Все узлы и ребра имеют от 5 до 10 свойств метаданных. Каждый день мы экспортируем данные обо всех наших клиентах из Neo4j в серию процессов Python, которые выполняют бизнес-логику.

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

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

Я пробовал проекты cypher-for-apache-spark и neo4j-spark-connector , ни один из которых не смог обеспечить скорость запросов и передачи данных, которые мы необходимость.

В настоящее время мы работаем на одном экземпляре Neo4j с 32 ГБ памяти и 8 ядрами. Поможет ли кластер смягчить эту проблему?

Есть ли у кого-нибудь какие-либо идеи или советы о том, как выполнить такой экспорт данных? Любое понимание проблемы будет с благодарностью!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Neo4j Enterprise поддерживает кластеризацию, вы можете использовать функцию Causal Cluster и запускать столько реплик чтения, сколько необходимо, параллельно выполнять запросы к репликам чтения, см. Эту ссылку: https://neo4j.com/docs/operations-manual/current/clustering/setup-new-cluster/#causal-clustering-add-read-replica

0 голосов
/ 02 мая 2018

Насколько я помню, Neo4j не поддерживает горизонтальное масштабирование, и все данные хранятся в одном узле. Чтобы использовать Spark, вы можете попытаться сохранить свой график в 2+ узлах и загрузить части набора данных из этих отдельных узлов, чтобы «имитировать» распараллеливание. Я не знаю, поддерживается ли он в обоих указанных вами разъемах.

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

  1. Найдите структуру данных, представляющую все, что вам нужно для обучения вашей модели.
  2. Хранить такой «сплющенный» график в некотором хранилище значений ключей (Redis, Cassandra, DynamoDB ...)
  3. Теперь, если что-то изменится на графике, отправьте сообщение в тему Кафки
  4. Добавьте потребителей, обновляющих данные на графике и в вашем хранилище значений ключей, сразу после (= просто обновите ветвь графика, на которую повлияло изменение, нет необходимости экспортировать весь график или изменить хранилище значений ключей в в тот же момент, но это очень вероятно приведет к дублированию логики)
  5. Сделайте так, чтобы ваша модель напрямую запрашивала хранилище значений ключей.

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

...